我有一个非常简单的聊天应用程序,其中有3个表用户,chat_rooms和聊天室表,以解决每个用户的消息。
我想在我的视图中显示聊天室,但我希望它们按messages created_at排序,以便拥有最新消息的聊天室位于顶部。
我使用的查询是
ChatRoom::with('user')
->join('chats','chat_rooms.room_id','chats.room_id')
->select('chat_rooms.*','chats.created_at as c','chats.message')
->orderBy('c','DECS')
->paginate(5);这很好,但是返回了我在查询中尝试使用groupBy('room_id')的所有聊天,但是它停止了工作。
我可以使用集合方法来修复这个问题,但是我不能使用分页,而且在这种情况下我真的不想使用集合方法。
注意到im使用Laravel5.4
发布于 2020-12-31 22:20:48
您雄辩的分页功能在ChatRoom表上运行,而不是在消息上运行。因此,您可以尝试另一种方式来加载您的信息在聊天室。
如果您有大量的聊天室,并且希望同时对聊天室和它们的消息进行分页,您可以对聊天室进行分页(不加入消息),并对每个聊天室消息运行雄辩的功能,separately.
。
向聊天室展示新信息:
拉力维尔<6
ChatRoom::select(['chat_rooms.*', 'chats.created_at as c'])
->join(DB::raw("(SELECT chats.room_id, max(chats.created_at) as created_at
FROM chats
GROUP BY room_id
ORDER BY created_at DESC
) as chats"), function ($join) {
$join->on("chat_rooms.id", "=", "chats.room_id");
})
->orderBy('c', 'DECS')
->paginate(5);Laravel >=6
$chatQuery = Chat::selectRaw("chats.room_id, max(chats.created_at) as created_at")
->groupBy("chats.room_id")
->orderBy("created_at", "desc");
ChatRoom::select(['chat_rooms.*', 'chats.created_at as c'])
->joinSub($chatQuery, 'chats', function ($join) {
$join->on('chat_rooms.id', '=', 'chats.room_id');
})
->orderBy('c','DECS')
->paginate(5);发布于 2020-12-31 20:38:53
如果只想在第一个orderBy之后按列排序,只需添加另一个orderBy即可。如果在该查询中使用groupBy,则会丢失大部分消息。
->orderByDesc('c')
->orderBy('room_id')
->paginate(5);https://stackoverflow.com/questions/65525117
复制相似问题