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);
是否可以保存查询构建器并多次使用它?
例如,我有一个模型'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);