Задать вопрос
graymore2
@graymore2

Как сгрупировать запрос в Laravel?

Привет!
Как в Laravel можно сгрупировать следующий алгоритм выдачи статей:

Сначала нужно взять 3 самых новых статьи.
Затем нужно взять 1 самую старую статью.
Затем нужно взять 3 статьи, где колонка "status" = 1 (true)
Затем взять статьи которые остались.

Это все должно быть выдано одним массивом в том порядке, который указан. Можно ли это сделать одним запросом?
  • Вопрос задан
  • 130 просмотров
Подписаться 1 Средний 6 комментариев
Пригласить эксперта
Ответы на вопрос 4
pLavrenov
@pLavrenov
Разработка сайтов
Этим вопросом есть смысл заниматься только если это вопрос с собеседования.
Три простых запроса лучше чем один упоротый.
Ответ написан
Комментировать
Adamos
@Adamos
Раз все равно "все, которые остались", значит, это вопрос условия сортировки.
Условие пока не сформулировано - если статус 1 у пяти статей, которые три из них надо брать?
Ну, и вымучивая один запрос, неплохо бы проверить, не получится ли он медленнее четырех простых: взять три последних айдишника (индекс, мгновенно), один первый (аналогично), три первых (видимо) по статусу, исключая полученное на предыдущих запросах (а вот с этим в одном запросе подзатрахаешься конкретно) - и окончательный селект, у которого в сортировке указаны эти айдишники как повышающие приоритет.

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

P.S. Подозреваю, третье условие просто сформулировано через жопу, и отдельного запроса здесь не надо - просто сначала вывести со статусом 1, а потом без.
Ответ написан
Комментировать
@nolotion
Это можно сделать одним запросом. Но если ты не можешь написать такой запрос - не надо сношать мозг - ты не сможешь его и поддерживать. Сделай три запроса и смержи данные в один массив.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Что-то типа:
$a = Model::orderBy("id", 'desc')->limit(3);
$b = Model::latest()->union($a)->get();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы