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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:58:08