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

Laravel需求:为账户管理员及下属用户创建Eloquent关联关系

Eloquent关联实现方案:账户用户与下属用户关联

需求背景

现有User模型与Account模型,关联关系如下:

  • 管理员用户通过account_user中间表(account_id | admin_id)关联到账户
  • 管理员通过user_management中间表(account_admin_id | end_user_id)管理下属用户

需要实现两个Eloquent关联:

  1. 获取某一账户的所有下属用户
  2. 获取某一账户的所有用户(管理员+下属用户)

实现步骤

1. 完善User模型关联

先在User模型中定义基础关联,方便后续复用:

class User extends Model
{
    /**
     * 当前用户管理的下属用户
     * @return BelongsToMany<User>
     */
    public function subordinates(): BelongsToMany
    {
        return $this->belongsToMany(
            related: User::class,
            table: 'user_management',
            foreignPivotKey: 'account_admin_id',
            relatedPivotKey: 'end_user_id'
        );
    }

    /**
     * 当前用户作为管理员关联的账户
     * @return BelongsToMany<Account>
     */
    public function managedAccounts(): BelongsToMany
    {
        return $this->belongsToMany(
            related: Account::class,
            table: 'account_user',
            foreignPivotKey: 'admin_id',
            relatedPivotKey: 'account_id'
        );
    }
}

2. 实现Account模型的关联

2.1 获取账户的所有下属用户

通过嵌套关联查询,从账户的管理员出发关联其下属用户,返回标准Eloquent关联实例:

class Account extends Model
{
    // 已实现的管理员关联
    public function admins(): BelongsToMany
    {
        return $this->belongsToMany(
            related: User::class,
            table: 'account_user',
            foreignPivotKey: 'account_id',
            relatedPivotKey: 'admin_id'
        );
    }

    /**
     * 获取账户的所有下属用户
     * @return BelongsToMany<User>
     */
    public function subordinateUsers(): BelongsToMany
    {
        return $this->belongsToMany(User::class)
            ->whereIn('users.id', function ($query) {
                $query->select('end_user_id')
                    ->from('user_management')
                    ->whereIn('account_admin_id', function ($subQuery) {
                        $subQuery->select('admin_id')
                            ->from('account_user')
                            ->where('account_id', $this->id);
                    });
            })
            ->select('users.*')
            ->distinct();
    }

2.2 获取账户的所有用户(管理员+下属)

合并管理员与下属用户的查询,返回支持链式调用的关联实例:

/**
     * 获取账户的所有用户(管理员+下属用户)
     * @return BelongsToMany<User>
     */
    public function allUsers(): BelongsToMany
    {
        $adminQuery = $this->admins()->getQuery();
        $subordinateQuery = $this->subordinateUsers()->getQuery();

        return $this->belongsToMany(User::class)
            ->fromSub($adminQuery->union($subordinateQuery), 'users')
            ->select('users.*')
            ->distinct();
    }
}

使用示例

// 预加载账户及其所有用户
$accounts = Account::with('allUsers')->get();

// 查询账户的活跃用户
$activeUsers = $account->allUsers()->where('active', true)->get();

// 获取账户的下属用户列表
$subordinates = $account->subordinateUsers()->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:32:19