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

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,提问作者Вячеслав Предеин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:10:19