让这幅风景优美:
我们有3种模型->用户,角色和权限。
关系
“用户-权限”关系的最终目的是覆盖通过其角色分配给用户的权限。该用户只是一个例外。
我正在尝试这样的事情:
public function permissions () {
return $this->hasManyThrough('App\Permission', 'App\Role')->merge($this->permissionOverrides);
}
在这种情况下,当我尝试快速加载模型权限时,Laravel会引发错误,因为未将权限视为关系。
另一方面,如果我们将“用户-角色”关系从“ 很多”更改为“ ”怎么办?
非常感谢您的知识!
编辑
角色关系
public function permissions() {
return $this->belongsToMany('App\Permission')->withTimestamps();
}
权限关系
public function roles() {
return $this->belongsToMany('App\Role')->withTimestamps();
}
用户关系
public function roles() {
return $this->belongsToMany('App\Role')->withTimestamps();
}
public function permissionOverrides() {
return $this->belongsToMany('App\Permission')->withTimestamps();
}
问题是如何使permissions()
关系合并角色权限和用户权限。
更好的解释
由于评论中显示的误解,我将尽力解释这一点。我已经设置了App \ User和App \ Role之间的所有关系;我还设置了App \ Role和App \ Permission之间的关系。我现在可以做:
$user->role->permissions;
为此,我配置了存储关系的数据透视表Permission_role。
事实并非如此。我想要的是在方程式中再加上一个var。现在,我希望能够覆盖角色权限,从而在App \ User和App \ Permission之间添加关系。我有数据透视表Permission_user和关系已建立:
public function permissionsOverride() {
return $this->belongsToMany('App\Permission');
}
真实问题是如何获取所有权限(角色权限和仅在一种关系中的替代权限)。我的意思是合并两种关系。
为什么我要合并关系?我可以做一个常规函数来做到这一点,但我想急于加载这种关系,Laravel。
答案 0 :(得分:1)
您可以像这样尝试User
和Role
之间的ManyToMany关系,类似地Role
和Permission
之间的ManyToMany关系。
用户模型
public function roles() {
return $this->belongsToMany('App\Role', 'user_role')->withTimestamps();
}
public function permissions() {
return $this->belongsToMany('App\Permission', 'permission_user')->withTimestamps();
}
角色模型
public function users() {
return $this->belongsToMany('App\User', 'user_role')->withTimestamps();
}
public function permissions() {
return $this->belongsToMany('App\Permission', 'permission_role')->withTimestamps();
}
获取数据
$user = User::with('permissions','roles','roles.permissions')->find(1);
$permissions = $user->permissions;
foreach($user->roles as $role){
$permissions->merge($role->permissions); //merger collection
}
dd($permissions->all());
有关详细信息,您可以查看https://laravel.com/docs/5.6/eloquent-relationships#many-to-many
对于收藏,您可以查看此https://laravel.com/docs/5.6/collections#method-merge