You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel查询构造器问题:如何仅展示用户对话对象而非全部用户

问题解决方法

当前查询用leftJoin会返回所有符合where过滤条件的用户(无论是否和当前用户有过对话),要仅展示有对话记录的对象,需要做两处关键修改:

  1. 替换连接类型:把leftJoin改成join(内连接),这样只有存在关联对话记录的用户才会被查询出来。
  2. 修正关联逻辑优先级:原orOn的写法会导致关联条件逻辑混乱,需要用闭包将两组对话关系的条件分组,确保“当前用户作为买家/卖家”的两种情况逻辑正确。

修改后的代码如下:

public static function otherUserData($user_id)
{
    $value = DB::table('users')
        ->select(['*', DB::raw('MAX(conver_date) AS lastConver')])
        ->join('conversation', function ($join) use ($user_id) {
            // 分组处理两种对话场景:当前用户是买家/卖家
            $join->where(function ($query) use ($user_id) {
                $query->where('conversation.conver_seller_id', '=', 'users.id')
                      ->where('conversation.conver_user_id', '=', $user_id);
            })->orWhere(function ($query) use ($user_id) {
                $query->where('conversation.conver_seller_id', '=', $user_id)
                      ->where('conversation.conver_user_id', '=', 'users.id');
            });
        })
        ->where('user_type', '!=', 'admin')
        ->where('id', '!=', $user_id)
        ->where('drop_status', '=', 'no')
        ->orderBy('lastConver', 'desc')
        ->groupBy('id')
        ->get(); 

    return $value;
}

如果特殊场景下需要保留leftJoin(但你需求是仅展示有对话的对象,此方案可选),也可以保留左连接,同时添加whereNotNull('conversation.id')过滤无对话记录的用户:

// 在现有where条件后追加
->whereNotNull('conversation.id')

内容的提问来源于stack exchange,提问作者shakes231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:40:08