【问题标题】:Laravel Relationship Union: One Relationship with two tables in a modelLaravel 关系联合:一个关系与模型中的两个表
【发布时间】:2018-12-11 11:39:48
【问题描述】:

让我们假设这个风景:

我们有 3 个模型 -> 用户、角色和权限。

关系

  • 用户与角色具有一对多关系。
  • 角色与权限有多对多的关系
  • 用户与 Permission 有多对多关系。

用户的最终目的——权限关系是覆盖通过他的角色分配给用户的权限。只是这个用户的一个例外。

我正在尝试这样的事情:

public function permissions () {
    return $this->hasManyThrough('App\Permission', 'App\Role')->merge($this->permissionOverrides);
}

在这种情况下,当我尝试预先加载模型权限时,Laravel 会抛出一个错误,因为权限未被检测为关系。

另一方面,如果我们将 User -- Role 关系更改为 ma​​ny 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/RoleApp/Permission 之间的关系?
  • 该关系在角色模型中设置。当我尝试合并两者时,问题就来了。你说的这个我试过了。我会将建立的关系放在我的问题上。
  • 最好在应用/角色和应用权限之间创建多对多,设置一个名为permission_role 的数据透视表,然后在用户/角色之间设置另一个名为role_user 的数据透视表。由于用户可以属于角色并且角色具有权限。那么你可以调用$user->roles()->permissions之类的东西来获取权限集合吗?

标签: laravel laravel-5.6 relationships


【解决方案1】:

你可以这样尝试,UserRole 之间的多对多关系,RolePermission 之间的多对多关系类似。

用户模型

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

【讨论】:

  • 非常感谢,但这不是我的问题。请看我的编辑,我添加了更好的解释,以便您更好地理解。
  • 如果可能的话,我想这样做:$user = User::with('permissions')->all();
  • 不,那只会返回用户直接权限而不是用户角色的权限
  • 这是我最初的问题,如何将合并的集合作为关系获取
  • 没关系@LordVermiis,希望你能找到更好的解决方案
猜你喜欢
  • 2014-10-25
  • 2018-12-29
  • 2021-01-07
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2018-04-15
  • 2017-01-20
相关资源
最近更新 更多