Laravel关联三张表:管理员多系统多角色权限实现方案
这个问题我之前做权限系统的时候也碰到过,核心就是要解决管理员在不同系统下拥有不同角色的三元关联需求,咱们一步步理清楚可行的方案:
方案一:扩展现有
admin_system中间表(首推) 你的需求本质是「管理员-系统-角色」三者的绑定关系——同一个管理员在A系统是超级管理员,在B系统可能只是普通操作员,所以最直接的路子就是给现有的admin_system表加一个role_id字段,把它变成三元关联表:
- 表结构建议:
id,admin_id(关联tbl_admins),system_id(关联tbl_systems),role_id(关联tbl_admin_roles)。如果要求一个管理员在一个系统下只能有一个角色,可以给admin_id+system_id加唯一索引;要是允许多角色,就不用加。 - 这种方式不需要额外新建表,也不一定非要给
admin_system单独建模型(当然如果业务需要记录更多关联信息,建模型也完全没问题)。拿常用的ORM框架举例,比如在Admin模型里可以这么定义关联:
public function systems() { return $this->belongsToMany(System::class, 'admin_system') ->withPivot('role_id') // 带上关联的角色ID ->using(AdminSystem::class); // 如果建了AdminSystem模型就加这句,没有可以省略 }
之后你就能通过$admin->systems拿到管理员关联的所有系统,同时通过$system->pivot->role_id直接获取该系统对应的角色ID,再关联到tbl_admin_roles表就能拿到角色详情了。
方案二:新增三元中间表(适合已有业务依赖原
admin_system表的场景) 如果你的admin_system表已经被其他业务逻辑绑定,没法随便修改结构,那可以新建一个admin_system_role中间表,结构是:id, admin_system_id(关联admin_system主键), role_id(关联tbl_admin_roles)。
- 这种情况下必须给
admin_system建模型,然后在AdminSystem模型里定义和AdminRole的关联:
public function roles() { return $this->belongsToMany(AdminRole::class, 'admin_system_role'); }
不过这个方案会多一层关联,查询的时候需要先查admin_system再跳转到admin_system_role,效率不如第一种高,所以除非有特殊业务限制,一般不推荐。
额外提醒
不管选哪种方案,核心都是要把「管理员、系统、角色」三者的关系绑定死,别出现“管理员的角色和系统脱节”的情况。如果用第一种方案,还能顺便给admin_system加一些扩展字段,比如权限生效时间、过期时间、创建人之类的,扩展性会更好。
内容的提问来源于stack exchange,提问作者Lyle
相关产品推荐
相关产品推荐

