Laravel Query Builder использовать несколько раз

Можно ли сохранить блок запросов и использовать его несколько раз?

Например, у меня есть модель "Тур".

Я создаю длинный запросник и разбиваю его на страницы:

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

Например, 97 моделей соответствуют вышеуказанному запросу. Метод "Paginate" выводит первые 10 моделей, подходящих для запроса, но мне также необходимо выполнить некоторые операции на всех 97 моделях. Я не хочу повторяться, написав этот длинный запрос 2 раза.

Поэтому я хочу что-то вроде:

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

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

Это правильный способ сделать в Laravel? (моя версия 5.4).

2 ответа

Решение

Вы можете, но это не имеет никакого смысла, потому что каждый раз будет выполняться новый запрос. Так что этот код будет работать:

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

Но если вы хотите выполнить только один запрос, вам нужно использовать методы сбора для упорядочения, фильтрации и отображения данных. Вам также необходимо создать экземпляр Paginator вручную:

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

Вам нужно использовать клон:

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

$tour1 = $query1->paginate(10); 
$tour2 = $query2->get();
Другие вопросы по тегам