【问题标题】:Using Auth to get the role of user in a pivot table使用 Auth 获取数据透视表中用户的角色
【发布时间】:2014-06-26 02:44:56
【问题描述】:

我有以下数据库结构,一个使用数据透视表连接的用户和角色表:

用户表包含所有信息,例如电子邮件和密码,而角色表定义了不同的角色:

角色表

  • 1 -> 管理员
  • 2 -> 编码器
  • 3 -> 推销员
  • 4 -> 技术

现在角色是多对多定义的,因为有些编码器也被分配为管理员。其他人可能具有推销员+管理员角色,甚至是编码员+推销员。基本上可以将多个角色分配给某人。

表结构

用户

  • 身份证
  • 电子邮件

角色

  • 身份证
  • 角色

role_user

  • 身份证
  • role_id
  • user_id

我知道如果我这样做了

$user = User::find(1)->email;
return $user;

结果将显示 ID 为 1 的用户的电子邮件。

我试图做$user = Auth::user()->roles;,以便它获得当前经过身份验证的用户的角色。

但是这样做会返回一个 JSON,其中显示了用户被分配到的所有角色。

我希望在过滤器中使用它,做这样的事情

$user=Auth::user()->roles;
if($user == 'admin')
{
    //do something
}
else
{
    //you are not an admin
}

if($user == 'encoder')
{
    //do something
}
else
{
    //you are not an encoder
}

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    只是对底部代码的一个小修复:

    public function hasRole($role = null) {
        $hasRole = false;
        $hasRole = !$this->roles->filter(function($item) use ($role) {
            return $item->name == $role;
        })->isEmpty();
        return $hasRole;
    }
    

    @lozadaOmr:您必须添加“使用”!

    【讨论】:

      【解决方案2】:

      由于它是many-to-many 关系,因此当您使用以下代码时,您将在$user 中获得一个集合:

      $user = Auth::user()->roles;
      

      因此,您需要循环所有Role 模型,并且必须在循环中检查if($someUser->role == 'admin'),在这种情况下,您可以这样做:

      $roles = Auth::user()->roles;
      $isAdmin = false;
      $isAdmin = !$roles->filter(function($role) {
          return $role->role == 'admin';
      })->isEmpty();
      if($isAdmin) {
          // admin...
      }
      

      您也可以像这样在 User 模型中添加一个方法:

      // User model
      public function isAdmin()
      {
          $isAdmin = false;
          $isAdmin = !$this->roles->filter(function($item) {
              return $item->role == 'admin';
          })->isEmpty();
          return $isAdmin;
      }
      

      所以你可以使用:

      if(Auth::user()->isAdmin()) {
          // admin...
      }
      

      更新:检查任何角色:

      public function hasRole($role = null)
      {
          $hasRole = false;
          $hasRole = !$this->roles->filter(function($item) {
              return $item->role == $role;
          })->isEmpty();
          return $hasRole;
      }
      

      现在你可以使用了:

      if(Auth::user()->hasRole('encoder')) {
          //...
      }
      

      【讨论】:

      • 感谢您的回答,它也帮助我了解到Auth::user() 只是经过身份验证的用户(用户模型),这就是您可以调用isAdmin() 方法的原因。这意味着它类似于$user= User::find(1); $user->isAdmin();
      • 我试过你的代码,效果很好。直到我尝试重用它来检查其他角色。奇怪的是它总是返回 true,即使经过身份验证的用户角色设置为编码器。我创建了isEncoder() 来检查if($item->role == 'encoder') return true; 等。
      • 这段代码有一个错误:Collection filter() 总是返回一个计算结果为true 的Collection,即使它是空的,所以$isAdmin/$hasRole 总是为真。您需要检查结果是否为空:$hasRole = ! $this->roles->filter(...)->isEmpty(); 或获取 Roles 集合的role 属性并使用in_array
      • @WereWolf-TheAlpha 我将hasRole() 函数放在用户模型中,但是每当我尝试它时,比如在路线上测试它,它都会给出错误Undefined variable: role,它指向这一行代码return $item->role == $role;
      • hasRole 是完美的。另一个给出了意想不到的结果。它没有验证角色并让用户继续。
      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 2020-01-14
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2017-05-17
      • 1970-01-01
      相关资源
      最近更新 更多