Сортировать основной запрос по подзапросу - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно перечислить все разговоры пользователя, отсортировав их по последнему полученному сообщению (так же, как и разговоры в WhatsApp).

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

Я пытался использовать distinct(), чтобы решить эту проблему, но в итоге попросил поместить messages.created_at в select, затем он снова дублирует результаты.

Chat::where('chats.from_id', $user_id)
        ->join('messages', 'chats.id', '=', 'messages.chat_id')
        ->select('chats.*')
        ->orderBy('messages.created_at', 'desc')
        ->get();

1 Ответ

0 голосов
/ 02 ноября 2018

Используйте это:

Chat::where('chats.from_id', $user_id)
    ->join('messages', 'chats.id', '=', 'messages.chat_id')
    ->select('chats.*', DB::raw('max(messages.created_at) latest_message'))
    ->groupBy('chats.id')
    ->orderBy('latest_message', 'desc')
    ->get();

Вы также можете использовать отношения, например ::10000

Chat::where('chats.from_id', $user_id)
    ->withCount(['messages as latest_message' => function($query) {
        $query->select(DB::raw('max(created_at)'));
    }])
    ->orderByDesc('latest_message')
    ->get();
...