【发布时间】:2018-12-11 11:39:48
【问题描述】:
让我们假设这个风景:
我们有 3 个模型 -> 用户、角色和权限。
关系
- 用户与角色具有一对多关系。
- 角色与权限有多对多的关系
- 用户与 Permission 有多对多关系。
用户的最终目的——权限关系是覆盖通过他的角色分配给用户的权限。只是这个用户的一个例外。
我正在尝试这样的事情:
public function permissions () {
return $this->hasManyThrough('App\Permission', 'App\Role')->merge($this->permissionOverrides);
}
在这种情况下,当我尝试预先加载模型权限时,Laravel 会抛出一个错误,因为权限未被检测为关系。
另一方面,如果我们将 User -- Role 关系更改为 many to many 会怎样?
非常感谢您的知识!
编辑
角色关系
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()关系合并角色权限和用户权限。
更好的解释
由于 cmets 中显示的误解,我将尝试更好地解释这一点。我已经设置了 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');
}
REAL QUESTION是如何获得所有权限(角色权限和覆盖权限仅在一个关系中)。我的意思是合并两种关系。
为什么要合并关系?我可以做一个常规函数来做到这一点,但我想以 Laravel 的方式急切地加载这个关系。
【问题讨论】:
-
对于用户/角色,您可以设置一个名为 role_user 的数据透视表,其中许多用户可以拥有多个角色,而许多角色可以拥有多个用户。由于您获得的权限未被检测为关系,您是否设置了
App/Role和App/Permission之间的关系? -
该关系在角色模型中设置。当我尝试合并两者时,问题就来了。你说的这个我试过了。我会将建立的关系放在我的问题上。
-
最好在应用/角色和应用权限之间创建多对多,设置一个名为permission_role 的数据透视表,然后在用户/角色之间设置另一个名为role_user 的数据透视表。由于用户可以属于角色并且角色具有权限。那么你可以调用
$user->roles()->permissions之类的东西来获取权限集合吗?
标签: laravel laravel-5.6 relationships