mysql - Laravel Eloquent 仅加入最大值行
问题描述
我有一个使用 Laravel 构建的聊天应用程序。聊天模型有很多消息。我想使用每个聊天中最新消息中的数据加入相关聊天。到目前为止,这就是它的设置方式
chats()->join('messages', function ($join) {
$join->on('messages.chat_id', '=', 'chats.id')
->on('messages.id', '=', DB::raw("(SELECT max(id) from messages WHERE messages.chat_id = chats.id)"));
})
这很好用,但我希望能够通过 max created_at 或 max modified_at 进行选择。如果我将 id 切换为 created_at('messages.created_at', '=', DB::raw("(SELECT max(id) from messages WHERE messages.chat_id = chats.id)"))
这可能会起作用,但如果两条记录具有相同的时间戳,则可能会导致不需要的行为。选择 max 时是否有某种方法可以检索整行以便我可以选择 id?
解决方案
我认为您想按时间对特定聊天的所有消息进行排序,从最新到最旧。此代码将加入chats
,messages
然后根据创建时间降序对消息进行排序。
$latestMessage = Message::select('chat_id', DB::raw('MAX(created_at) as
last_message_created_at'))
->groupBy('chat_id');
$chats = Chat::joinSub($latestMessage, 'messages', function ($join) {
$join->on('chats.id', '=', 'messages.chat_id');
})->get();
推荐阅读
- java - Java while 循环,循环次数超出预期
- node.js - 在 JS 中使用 Cloud Functions 将数据设置到 Firestore
- python - 布局之间的 PyQT 导航
- node.js - 为什么 Mongoose 将我的帖子对象添加到用户的收藏中?
- powershell - 将文件上移一级文件夹
- reactjs - 强制子组件重新渲染(React)
- c# - 将选定的行从 WPF DATAGRID 检索到 DataTable
- mysql - 工作台侧边栏面板中数据库菜单下的表子菜单下拉选项不可用
- java - 找不到记录器的附加程序(com.zaxxer.hikari.HikariConfig)
- python - python在同一行搜索不同的字符串