Yii2中实现User模型关联所有角色及用户角色筛选
用户与角色关联查询问题解答
数据库结构与表间关系
表结构
CREATE TABLE user ( id INT, date_birth DATE, first_name VARCHAR(20), last_name VARCHAR(20), email VARCHAR(30), phone VARCHAR(20) ) CREATE TABLE account ( id INT, user_id INT, ssml_number INT, room_number INT, ) CREATE TABLE account_role ( id INT, account_id INT, role_id INT, ) CREATE TABLE role ( id INT, name VARCHAR(80), description TEXT, )
关联关系
- User 与 Account 为一对多(一个用户可拥有多个账号)
- Account 与 Role 通过
account_role表实现多对多关联
问题解答
1. 是否可在User模型中创建关联,通过$user->roles获取该用户所有账号的角色?
可以。在Laravel的User模型中,你可以直接定义跨表关联,通过account和account_role两个中间表获取用户所有账号的角色,同时去重避免重复数据:
// app/Models/User.php public function roles() { return $this->belongsToMany(Role::class) ->through('account', 'account_role') ->select('role.*') ->distinct(); }
也可以通过嵌套关联的方式定义,逻辑更直观:
// 先定义用户到账号的一对多关联 public function accounts() { return $this->hasMany(Account::class); } // 基于账号关联,获取所有关联角色 public function roles() { return $this->hasManyThrough(Role::class, Account::class) ->join('account_role', 'account.id', '=', 'account_role.account_id') ->whereColumn('role.id', '=', 'account_role.role_id') ->select('role.*') ->distinct(); }
定义完成后,直接通过$user->roles即可获取该用户所有账号关联的角色集合。
2. 如何在UserSearch的查询中筛选出至少拥有一个角色的用户,或完全无角色的用户?
假设使用Laravel查询构造器或Eloquent模型实现,具体写法如下:
筛选至少拥有一个角色的用户
通过whereHas检查用户是否存在关联的带角色账号:
// UserSearch中的查询逻辑 $query->whereHas('accounts', function ($subQuery) { $subQuery->whereHas('roles'); });
如果已经定义了User模型的roles关联,可简化为:
$query->whereHas('roles');
筛选完全无角色的用户
通过whereDoesntHave检查用户没有任何关联的带角色账号:
$query->whereDoesntHave('accounts', function ($subQuery) { $subQuery->whereHas('roles'); });
若已定义User的roles关联,也可简化为:
$query->whereDoesntHave('roles');
内容的提问来源于stack exchange,提问作者Вячеслав Предеин
相关产品推荐
相关产品推荐

