Laravel Relationship Union:一个关系与一个模型中的两个表

时间:2018-07-03 08:21:09

标签: laravel laravel-5.6 relationships

让这幅风景优美:

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

关系

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

“用户-权限”关系的最终目的是覆盖通过其角色分配给用户的权限。该用户只是一个例外。

我正在尝试这样的事情:

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。

1 个答案:

答案 0 :(得分:1)

您可以像这样尝试UserRole之间的ManyToMany关系,类似地RolePermission之间的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