Laravel查询构造器问题:如何仅展示用户对话对象而非全部用户
问题解决方法
当前查询用leftJoin会返回所有符合where过滤条件的用户(无论是否和当前用户有过对话),要仅展示有对话记录的对象,需要做两处关键修改:
- 替换连接类型:把
leftJoin改成join(内连接),这样只有存在关联对话记录的用户才会被查询出来。 - 修正关联逻辑优先级:原
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
相关产品推荐
相关产品推荐

