让我们来看看这个风景:
我们有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和关系stablished:
public function permissionsOverride() {
return $this->belongsToMany('App\Permission');
}
REAL QUESTION是如何获得所有权限(仅在一个关系中的角色权限和覆盖权限)。我的意思是合并两种关系。
为什么我要合并关系?我可以做一个常规的功能来做到这一点,但我想热切地加载这种关系,Laravel方式。
你可以尝试这样,在Qazxswpoi和User
之间的ManyToMany关系,类似于Qazxswpoi和Role
之间的ManyToMany关系。
用户模型
Role
榜样
Permission
获取数据
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();
}
而对于Collection,你可以看看这个$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());