Laravel OrderBy leftJoin?

Добрый вечер! Ребят у меня есть таблица с заказами, так же есть таблица с логами, в которой мы храним всякое разное. В том числе и дату смены платежного статуса. Мне нужно отсортировать таблицу orders по последней связанной с orders записью в logs.

Например вчера сменили платежный статус 2 раза и сегодня 1 раз, отсортировать нужно по дате той записи в логах, которая была сделана сегодня. Есть для этого небольшой скоуп, в целом я все сделал исходя из документации laravel.

public function scopeFilteredByPStatus($query)
    {
        if (request()->get('pstatus')) {
            return $query->select('orders.*')
                ->leftJoin('logs', function ($join) {
                    return $join->on('orders.id', '=', 'logs.entity_id')->latest()->limit(1);
                })
                ->groupBy('logs.entity_id')
                ->where('orders.payment_status', request()->get('pstatus'))
                ->orderBy(DB::raw('logs.created_at'), 'DESC');
        }
    }


Тем не менее я получаю результаты в разнобой, сортировка то происходит происходит ибо выдача изменилась с таким скоупом, но она все еще не та которую я рассчитываю получить. Отправьте меня в правильном направлении пожалуйста, потому, что я в самом деле в некотором замешательстве...
Спасибо!
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@Stalinko
PHP'шник и фрилансер до мозга костей
Немного непонятно, почему вы делаете GROUP BY по таблице, которая добавляется через LEFT JOIN. Ведь LEFT JOIN значит, что данных может и не быть, т.е. пойдёт группировка по NULL.

Что делает latest()->limit(1) внутри условий join'a?

И какая у вас вообще цель? Отсортировать заказы по дате последнего события? К сожалению, группировка с сортировкой так не работают. Сначала оно группирует по logs.entity_id, выбрав произвольную запись из logs, а затем получившиеся строки отсортирует.

Вам нужно что-то вроде этого:

SELECT orders.*
FROM orders
LEFT JOIN (
    SELECT entity_id, MAX(created_at) created_at
    FROM logs
    GROUP BY entity_id
) t ON orders.id = t.entity_id
ORDER BY t.created_at DESC

На синтаксис Laravel переложите сами :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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