Laravel 多次使用查询生成器

Laravel Query Builder use multiple times

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

例如,我有一个模型'Tour'。

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

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

例如,符合上述查询条件的机型有97个。 "Paginate" 方法输出符合查询条件的前 10 个模型,但我还需要对所有 97 个模型进行一些操作。 我不想 'repeat myself' 将这个长查询写两次。

所以我想要这样的东西:

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

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

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

您需要使用clone:

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

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

可以,但没有任何意义,因为每次都会执行新的查询。所以这段代码将起作用:

$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);