Laravel中如何从linkUser表获取当前用户的关联用户详情
解决方案:获取当前用户的所有关联用户详情
问题分析
你的linkUser表采用双向存储用户关联关系(比如用户4和6的关联会生成两条记录:(4,6)和(6,4)),之前的代码仅查询了user_id = $loggedUserId的记录,会漏掉以当前用户为LinkedUser ID的关联数据(比如记录1中User Id为4、LinkedUser ID为6,这条关联对应用户4,原代码无法捕获)。同时你需要的是user表的用户详情,而非linkUser表的关联记录,因此需要结合关联查询实现。
实现方法
方法1:DB查询构造器分步实现
$loggedUserId = 6; // 提取所有关联的用户ID并去重 $linkedUserIds = DB::table('linkUser') ->where('User Id', $loggedUserId) ->orWhere('LinkedUser ID', $loggedUserId) ->get() ->map(function ($item) use ($loggedUserId) { // 判断当前用户在关联记录中的角色,提取对应的关联用户ID return $item->{'User Id'} == $loggedUserId ? $item->{'LinkedUser ID'} : $item->{'User Id'}; }) ->unique() ->values(); // 关联user表获取用户详情 $linkedUsers = DB::table('user') ->whereIn('id', $linkedUserIds) ->get();
方法2:子查询优化(单次查询完成)
$loggedUserId = 6; $linkedUsers = DB::table('user') ->whereIn('id', function ($query) use ($loggedUserId) { $query->select(DB::raw('CASE WHEN `User Id` = ? THEN `LinkedUser ID` ELSE `User Id` END')) ->from('linkUser') ->where('User Id', $loggedUserId) ->orWhere('LinkedUser ID', $loggedUserId) ->distinct(); // 直接在子查询中去重 }, [$loggedUserId]) ->get();
方法3:Eloquent模型关联(推荐)
假设已定义User模型,先在模型中添加关联方法:
// User.php public function linkedUsers() { return $this->belongsToMany(User::class, 'linkUser', 'User Id', 'LinkedUser ID') ->orWherePivot('LinkedUser ID', $this->id) ->distinct(); }
然后直接调用关联获取数据:
$loggedUser = User::find($loggedUserId); $linkedUsers = $loggedUser->linkedUsers;
注意事项
- 表字段名包含空格(
User Id、LinkedUser ID),查询时需用反引号包裹避免语法错误 - 必须通过
unique()或distinct()去重,否则双向关联会导致同一用户数据重复返回 - 最终返回的
$linkedUsers即为当前用户关联的所有用户详情(例如用户6对应user1、user3、user4)
内容的提问来源于stack exchange,提问作者user3653474
相关产品推荐
相关产品推荐

