Laravel需求:为账户管理员及下属用户创建Eloquent关联关系
Eloquent关联实现方案:账户用户与下属用户关联
需求背景
现有User模型与Account模型,关联关系如下:
- 管理员用户通过
account_user中间表(account_id|admin_id)关联到账户 - 管理员通过
user_management中间表(account_admin_id|end_user_id)管理下属用户
需要实现两个Eloquent关联:
- 获取某一账户的所有下属用户
- 获取某一账户的所有用户(管理员+下属用户)
实现步骤
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
相关产品推荐
相关产品推荐

