php - Laravel 按最后一条消息对对话进行排序
问题描述
我有一个Conversation
有很多模型的ConversationMessage
模型。
现在我想根据对话的最后一条消息对对话进行排序。基本上就像WhatsApp。如何构建查询?
作为我的代码的旁注:对话包含一个用户 ( user_id
) 和一个关联的公司 ( company_id
)。公司与用户有belongsToMany
关系。
Conversation::whereHas('company', function ($q) use ($userId) {
$q->whereHas('users', function ($q1) use ($userId) {
$q1->where('users.id', $userId);
});
})->orWhereHas('user', function($q) use ($userId) {
$q->where('user.id', $userId);
})->with(array('conversationMessage' => function($q) {
$q->orderBy('created_at', 'DESC');
})->get();
对关系模型进行排序,ConversationMessage
而不是对对话进行排序。如何Conversations
根据最后一条消息进行排序?
解决方案
您可以向模型添加一个timestamp
字段,当有新消息添加到该字段时更新该字段,然后您可以根据.last_message_at
Conversations
Conversation
last_message_at
或者您可以在查询中过滤结果,如下所示(测试它是否有效):
Conversation::whereHas('company', function ($q) use ($userId) {
$q->whereHas('users', function ($q1) use ($userId) {
$q1->where('users.id', $userId);
});
})->orWhereHas('user', function($q) use ($userId) {
$q->where('user.id', $userId);
})->with(array('conversationMessage' => function($q) {
$q->orderBy('created_at', 'DESC');
})
->selectRaw("conversations.*, (SELECT MAX(created_at) from conversation_messages WHERE conversation_messages.conversation_id=conversations.id) as latest_message_on")
->orderBy("latest_message_on", "DESC")
->get();
推荐阅读
- python - “在 Python 控制台中运行文件”查找错误目录
- python - 在 jupyter notebook 的 python 源代码中调用函数
- powershell - 如何在 Powershell 中安装 Mailkit
- github - 当脚本在本地运行时 GitHub Actions 失败,在自托管上没有问题,因为 NPM 警告
- php - PayPal PHP SDK 1.14 致命错误,无法解决错误
- python - Python:获取裁剪区域外的平均颜色
- firebase - Flutter - Firebase:迭代列表中的子列表
- assembly - 如何将对应的 (*) 值显示为 2 位十六进制数字在四位 7 段 LED 显示屏的最右边两位?
- php - 提交按钮只保存一个输入框
- php - Magento 2 数据补丁问题