laravel - Laravel orderby 加入 2 个没有雄辩关系的表
问题描述
我有 2 张桌子用于聊天系统
“用户”表结构:
ID | 姓名 |
---|
“消息”表结构:
ID | 发件人ID | 接收者 ID | 信息 |
---|
我想返回上次你和朋友聊天时订购的朋友用户。注意:id
与时间戳相同
认为,
ID | 发件人ID | 接收者 ID | 信息 |
---|---|---|---|
1 | $userA->id |
$userB->id |
美国广播公司 |
2 | $userC->id |
$userA->id |
xyz |
所以,如果$userA
是登录用户 - 我希望用户返回如下:
[
0 => $userC,
1 => $userB,
2 => $userD,
3 => $userE,
4 => $userF,
...
]
(其中$userD
, $userE
,$userF
没有与用户的消息$userA
)
基本上,如果用户与登录用户有任何消息,我想返回所有使用排序的朋友用户。
我当前的代码给了我一些意想不到的结果-
return DB::table('users')->leftJoin('messages', function ($join) {
$join->on('users.id', '=', 'messages.sender_id')
->where('messages.sender_id', auth()->id())
->orOn('users.id', '=', 'messages.receiver_id')
->where('messages.receiver_id', auth()->id());
})
->select('users.*')
->where('users.id', '!=', auth()->id())
->orderBy('messages.id', 'asc')
->get();
解决方案
老实说,我不确定这是否会起作用,因为我无法测试它,但我认为代码应该是这样的:
$messagesSent = DB::table('messages')
->select('sender_id as other_user', DB::raw('MAX(id) as last_message_id'))
->where('receiver_id', auth()->id())
->groupBy('sender_id');
$messagesSentOrReceived = DB::table('messages')
->select('receiver_id as other_user', DB::raw('MAX(id) as last_message_id'))
->where('sender_id', auth()->id())
->groupBy('receiver_id')
->union($messagesSent);
$usersWithCommunication = DB::table('users')
->select('other_user', DB::raw('MAX(last_message_id) as last_message_id'))
->joinSub($messagesSentOrReceived, 'latest_messages', function ($join) {
$join->on('users.id', '=', 'latest_messages.other_user');
})
->groupBy('other_user');
return DB::table('users')
->leftJoinSub($usersWithCommunication, 'latest_communications', function ($join) {
$join->on('users.id', '=', 'latest_communications.other_user');
})
->select('users.*')
->orderBy('latest_communications.last_message_id', 'asc')
->get();
推荐阅读
- php - $Post 上的 PHP 500 错误 我的代码中有任何错误吗?
- macos - unixODBC 在 Mac 上失败,“[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed”
- javascript - 在 node-red/vanilla js 函数中模拟异步等待
- python-3.x - 在 matplotlib 图中插入 png 图像
- android - 如何在android studio中更改字符串的值以将其作为全局变量
- r - 在 R 中用 K-means 标记特定集群
- c# - Angular 9 + Angular Material Mat 表更新一条记录
- javascript - 如何在滚动时无限重复内容?
- redirect - JAX-RS:客户端:在遵循重定向之前拦截重定向
- javascript - 如何编写代码来检查进程是否在 Node/JS 中确实是并行的