与Eloquent和Laravel的相互关系

时间:2018-09-29 07:25:37

标签: laravel eloquent

我有6张桌子:

permissions:
id
permission_name

roles:
id
role_name

user_roles:
id 
user_id 
role_id

user_permissions:
id 
user_id 
permission_id

role_permissions:
id
role_id
permission_id

users:
id
username
email

现在,我想为权限的Eloquent模型添加自定义函数,名为 getUsersWithPermission()

现在,用户可能已经通过其所授予的角色获得了权限(用户表在user_roles上进行联接,在role_permissions上进行联接,最后在权限上进行联接。

或者用户在user_permissions表中设置了特定的权限(在user表上加入user_permissions表,在user_permissions表上加入权限表)

如何创建一个Eloquent模型函数,该函数返回具有特定权限的所有用户说:“ notification.error.process”,其中是权限名称

一个 hasMany 并没有完全满足我的要求(并且我无法在其中定义多个表)。我正在使用Laravel 5.6。

2 个答案:

答案 0 :(得分:0)

如果您正确定义了多对多关系(User-Permission和User-Role-Permission),则应使用以下方法:

$permissionName = 'notification.error.process';
$usersWithPermission = User::whereHas('permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->orWhereHas('roles.permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->get();

答案 1 :(得分:0)

尝试使用此ER图了解您的表结构。

model ER diagram of your table structure

要处理这种情况,您可以创建3个“口才模型”

  1. 用户
  2. 角色
  3. 权限

在每个模型中,您可以创建与其他模型的belongsToMany()关系。

一个示例,关于“用户模型”

public function permissions()
{
    // need to define any other differences in your tables foreign keys as  2nd, 3rd parameters and so on.
    return $this->belongsToMany(Permission::class);
}

现在,您需要让所有用户“拥有具有特权的角色” OR “直接拥有特权的用户。

这样做。

$users = User::whereHas('privileges', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->orWhereHas('roles.permissions', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->get();

希望您能有个主意。您的代码可能与我的代码略有不同。但这就是概念。