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