首页 > 解决方案 > 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();

标签: laravellaravel-query-builder

解决方案


老实说,我不确定这是否会起作用,因为我无法测试它,但我认为代码应该是这样的:

$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();

推荐阅读