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

问题描述 投票:0回答:1

让我们来看看这个风景:

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

关系

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

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

我想尝试这样的事情:

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方式。

laravel laravel-5.6 relationships
1个回答
1
投票

你可以尝试这样,在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());

© www.soinside.com 2019 - 2024. All rights reserved.