使用Auth在虚拟对象表中获取用户的角色

时间:2014-05-08 15:38:15

标签: laravel laravel-4 eloquent

我有以下数据库结构用户和&角色表使用数据透视表加入:

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

角色表

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

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

表结构

用户

  • ID
  • 电子邮件

角色

  • ID
  • 作用

ROLE_USER

  • ID
  • 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
}

2 个答案:

答案 0 :(得分: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')) {
    //...
}

答案 1 :(得分:2)

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

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

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