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