【问题标题】:Laravel Query Builder use multiple timesLaravel 查询生成器多次使用
【发布时间】:2018-02-27 18:05:39
【问题描述】:

是否可以保存查询构建器并多次使用?

例如,我有一个模型“Tour”。

我创建了一个长查询构建器并对其进行分页:

$tour = Tour::where(...)->orWhere(...)->orderBy(...)->paginate(10);

例如,97 个模型符合上述查询条件。 “分页”方法输出符合查询条件的前 10 个模型,但我还需要对所有 97 个模型进行一些操作。 我不想“重复自己”写这个长查询 2 次。

所以我想要类似的东西:

$query = Tour::where(...)->orWhere(...)->orderBy(...);

$tour1 = $query->paginate(10); 
$tour2 = $query->get();

这是在 Laravel 中正确的做法吗? (我的版本是 5.4)。

【问题讨论】:

  • 是的。这是正确的做法。

标签: laravel query-builder


【解决方案1】:

你可以,但它没有任何意义,因为每次都会执行一个新查询。所以这段代码可以工作:

$query = Tour::where(...)->orWhere(...)->orderBy(...);
$tour1 = $query->paginate(10); 
$tour2 = $query->get();

但如果您只想执行一个查询,则需要使用集合方法对数据进行排序、过滤和映射。你还需要create Paginator instance manually:

$collection = Tour::where(...)->orWhere(...)->orderBy(...)->get();
$tour1 = // Make Paginator manually.
$tour2 = $collection;
$sortedByName = $collection->sortBy('name');
$activeTours = $collection->where('active', 1);

【讨论】:

  • 我将添加我手动创建分页器的方式:使用 Illuminate\Pagination\LengthAwarePaginator 作为分页器; //获取当前页面: $current_page = Paginator::resolveCurrentPage(); // 获取当前页面的项目(使用 values() 方法重置键): $items = $collection->slice(($current_page - 1) * $paginate, $paginate)->values(); // 获取项目总数 $total = $collection->count(); // PAGINATE!:) $tours = new Paginator($items, $total, $paginate, $current_page, ['path' => Paginator::resolveCurrentPath()]);
【解决方案2】:

你需要使用clone:

$query = Tour::where(...)->orWhere(...)->orderBy(...);
$query1 = clone $query;
$query2 = clone $query;

$tour1 = $query1->paginate(10); 
$tour2 = $query2->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多