laravel - 如何在 Laravel 6/7 中访问多个多对多关系
问题描述
祝大家好日子,
我有 3 个模型,即用户、角色和权限。
用户与角色
具有多对多关系角色与权限具有多对多关系
我有 5 个表,用户、角色、角色用户、权限、权限角色
我的问题是:用户模型中有没有办法访问分配给用户角色的所有权限?
谢谢大家。
代码:
用户模型
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function permissions()
{
//how can i get all permissions of the user
}
}
好榜样
class Role extends Authenticatable
{
public function users()
{
return $this->belongsToMany(User::class);
}
public function permissions()
{
return $this->belongsToMany(Permission:class);
}
}
权限模型
class Permission extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
解决方案
尝试这个:
class User extends Authenticatable
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function permissions()
{
$permissionList = [];
foreach($this->roles as $role){
foreach($role->permissions as $permission){
if(!in_array($permission->name, $permissionList){
$permissionList[] = $permission->name
}
}
}
return $permissionList;
}
}
我认为你必须先迭代你的角色才能获得权限,你也可以使用 append 属性来获得你的用户权限作为它的属性, 在这里阅读更多。
哦,我记得你也可以使用嵌套的预先加载,所以你可以像这样在角色内部调用你的权限,$user->with('roles.permissions')->get()
但是当然你必须首先从角色关系中迭代它来获取权限数据。
推荐阅读
- spring-boot - 特定 api 的 spring boot 拦截器,不应为所有 api 调用
- flutter - 仅为行而不是标题更改 DataRow 上的分隔线颜色
- azure - 用于测试的 ARM TTK 引发错误:Azure DevOps Pipeline 中的位置不应硬编码
- java - 在函数/对象构造的地方重新抛出异常
- javascript - npm init 不会创建 package.json 文件
- data-fitting - 使用 scipy.stats.rv_continuous.fit 将数据拟合到分布的问题
- svg - SVG图形内的材料设计图标(MDI)?
- reactjs - 测试单选按钮组的箭头键键盘导航
- rust - 为什么某些函数调用在 Rust 之前有句点?
- gitlab-ci - 如何在 windows、linux 和 macos 上运行 ci?