按子查询对主要查询进行排序

时间:2018-11-02 02:14:15

标签: laravel eloquent laravel-5.6

我需要列出用户的所有对话,并按最近收到的消息进行排序(与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 :(得分:2)

使用此:

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

您还可以使用关系,例如:

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