Laravel使用Bouncer库时用户角色关联查询返回空结果如何解决
问题原因及修复方案
核心错误点
你当前的关联关系完全写反了,同时遗漏了Bouncer中间表的多态字段过滤条件,导致关联查询匹配不到数据:
- User模型的关联类型选错,外键顺序倒置:
belongsTo表示当前模型持有外键,而实际是assigned_roles中间表持有关联用户的entity_id外键,用户侧应该用hasMany - AssignedRole模型的关联参数全部写反:Laravel关联方法的外键参数顺序为「当前表外键字段,关联表主键字段」,你当前的参数顺序完全倒置
- 遗漏Bouncer多态关联条件:Bouncer默认的
assigned_roles是多态中间表,通过entity_type字段区分不同的权限主体模型,没有加该过滤条件也会导致关联查询为空
具体修改代码
1. 修改User模型的roles关联
public function roles() { return $this->hasMany(\App\AssignedRoles::class, 'entity_id', 'id') // 过滤多态类型,只查用户模型对应的角色分配记录 ->where('entity_type', static::class); }
如果要直接跳过中间表拿到角色对象,可直接定义多对多关联,更方便后续使用:
public function actualRoles() { return $this->belongsToMany(\App\Role::class, 'assigned_roles', 'entity_id', 'role_id') ->where('entity_type', static::class); }
2. 修改AssignedRole模型的关联
// 一条角色分配记录对应一个用户 public function user() { return $this->belongsTo(\App\User::class, 'entity_id', 'id'); } // 一条角色分配记录对应一个角色 public function roleName() { // 参数顺序:关联模型,当前表外键,关联表主键 return $this->belongsTo(\App\Role::class, 'role_id', 'id'); }
验证查询
修改完成后,两种查询方式均可拿到对应数据:
- 查用户+角色分配记录+角色信息:
User::with('roles.roleName')->get() - 直接查用户+角色列表:
User::with('actualRoles')->get()
内容的提问来源于stack exchange,提问作者scorpions78
相关产品推荐
相关产品推荐

