【问题标题】:How to get permissions from a user that has multiple roles in Laravel?如何从 Laravel 中具有多个角色的用户那里获取权限?
【发布时间】:2023-03-21 14:50:01
【问题描述】:

我正在构建一个新的 laravel 应用程序,其中一个用户可以拥有多个角色,并且这些角色拥有多个权限(权限)。现在我想从某个用户那里获得所有权限。

我正在使用 Laravel 5.8 和 Eloquent。我可以从用户那里获得角色,从角色那里获得权限,但不能从用户那里获得权限。

 dd(Auth::user()->roles->rights);

模型用户:

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

模特角色:

    public function users()
    {
        return $this->belongsToMany(User::class);
    }

    public function rights()
    {
        return $this->belongsToMany(Right::class);
    }

模型对

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

我希望通过他所拥有的角色获得一位用户过去低谷的所有权限。

【问题讨论】:

标签: laravel eloquent many-to-many laravel-5.8


【解决方案1】:

您可以将方法 rights() 添加到用户模型:

public function rights()
    {
        return $this->hasManyThrough(Role::class, Right::class);
    }

然后使用 $user->rights();


附加信息: Laravel 没有考虑多对多。

你可以安装包

composer require staudenmeir/eloquent-has-many-deep

并使用它:

class User extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function rights()
    {
        return $this->hasManyDeep(Right::class, ['role_user', Role::class]);
    }
}

【讨论】:

  • 感谢您的贡献!如果我这样做,我会收到此错误。 SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'rights.user_id'(SQL:选择roles.*,rights.user_id as laravel_through_key from roles inner join @ 987654330@ rights.id = roles.right_id 其中rights.user_id = 200)
  • @Arne,对不起,我很困惑,请尝试返回 $this->hasManyThrough(Right::class, Role::class);
  • 我注意到你的小错误,但这并没有解决我的问题。我仍然得到 een SQLSTATE-error SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'field list' (SQL: select rights.*, roles.user_id` as laravel_through_key from rights inner join roles on roles.id = rights@@。 roles.user_id = 200)`
  • @Arne,Sororm Laravel 对多对多不彻底,你可以安装 github.com/staudenmeir/eloquent-has-many-deep 并使用 class User extends Model { use \Staudenmeir\EloquentHasManyDeep\HasRelationships; public function permissions() { return $this->hasManyDeep(Permission::class, ['role_user', Role::class]); } }
  • 谢谢,我以后会用到它,我现在只写我自己的 SQL 语句就行了。我会看看你的解决方案。
【解决方案2】:

由于一个用户可以拥有多个角色,而一个角色可以拥有多个权限, 您将需要遍历每个角色

//Retrieving rights associated with the user
public function retrieveRightsAssociatedWithUser($user){
    $rightsAssociatedWithUser = [];
    foreach($user->roles as $role){
        $rightsAssociatedWithUser[] = $role->rights; 
    }
    return $rightsAssociatedWithUser;
}

【讨论】:

  • 没有更好的解决方案吗?即使您可以缓存权限,我也不喜欢在 foreach 中执行 foreach。目前我正在使用 dd(Auth::user()->load('roles.rights'));这给了我一系列权利,但我可以访问它们
  • 没有。我现在不知道有任何其他方法可以检索数据。您可以预先加载权限和角色以使速度更快。
  • 您可以删除一个 foreach 并用一个 foreach 检索所有权限。我已经更新了我的答案。请看一下
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 2016-06-02
  • 2021-05-29
相关资源
最近更新 更多