我有以下数据库结构用户和&角色表使用数据透视表加入:
users表包含所有信息,如电子邮件和密码,而roles表定义了不同的角色:
角色表
现在角色定义为多对多,因为有些编码器也被指定为管理员。其他人可能有推销员+管理员角色,甚至编码器+推销员。基本上可以将多个角色分配给某人。
用户
角色
ROLE_USER
我知道如果我这样做
$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
}
答案 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:你必须添加“使用”!