【问题标题】:Mutli relationships with Eloquent and Laravel在 Laravel 中与 Eloquent 建立多重关系
【发布时间】:2019-03-05 02:11:40
【问题描述】:

我有 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 模型中为 permissions 添加一个自定义函数,名为 getUsersWithPermission()

现在用户可能拥有他所赋予的角色的权限(用户表加入 user_roles,加入该表的 role_permissions 并最后加入该表的权限。

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

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

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

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    如果您正确定义了多对多关系(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();
    

    【讨论】:

    • 你是什么意思 bij 正确定义了你的多对多关系?
    • 你没有发布你的模型代码,所以我只能假设你在那里定义了关系。 laravel.com/docs/5.7/eloquent-relationships#many-to-many
    • 我了解如何创建与 user_permission 表的关系,但是您的第二段代码 >orWhereHas('roles.permissions', function($query) use ($permissionName) { $query->whereName($permissionName); })->get(); 我仍然不明白如何在模型中设置关系?还是我需要在“RolePermission”模型中创建关系?
    • 您不需要为 user_permission 或 role_permission 等中间表创建模型。您需要在用户和权限、用户和角色之间以及角色和权限之间创建多对多关系,就像在文档中一样。然后你就可以使用上面的查询了。它返回具有给定名称的permissions 记录的所有用户以及具有roles 记录的用户,而这些用户又具有具有给定名称的permissions 记录。
    【解决方案2】:

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

    要处理这种情况,您可以创建 3 个“Eloquent Models”

    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();
    

    我希望你能得到一个想法。您的代码可能与我的略有不同。但这是概念。

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 2015-11-10
      • 2016-10-05
      • 2022-01-24
      • 2021-02-06
      • 2015-05-19
      • 1970-01-01
      • 2020-06-28
      相关资源
      最近更新 更多