我正在制作一个带有laravel的博客。当我查看用户身份验证时,我在这里遇到了一些问题。我有2个表,一个是用户:id,name,...另一个是role:user_id,privilege ..我需要检查用户是否是admin,我需要一个像isAdmin()
这样的函数一个$isAdmin
属性。这是我的功能放在 app / providers / AuthServiceProvider.php 中:
private static $isAdmin;
public static function isAdmin() {
if (isset(self::$isAdmin)) {
return self::$isAdmin;
}
$user_privilege = DB::table('role')
->select('privilege')
->where([
['privilege', '=', 'admin'],
['user_id', '=', Auth::user()->id],
])
->get()
->first();
self::$isAdmin = isset($user_privilege->privilege);
return self::$isAdmin;
}
此代码工作正常,但这需要对数据库进行两次查询以检查用户的管理员权限。所以我想找到一种方法将查询注入Auth :: user(),这样只有一个查询可以检索我想要的所有东西。我是laravel的初学者。你能救我吗?
答案 0 :(得分:3)
我认为用户只能有一个角色。您可以在isAdmin()
模型中创建User
方法:
public function isAdmin()
{
return auth()->user()->role->privilege === 'admin';
}
如果您还没有这样做,请定义关系:
public function role()
{
return $this->hasOne(Role::class);
}
然后将其与auth()->user()->isAdmin()
一起使用。
如果用户可以有多个角色:
public function isAdmin()
{
auth()->user()->loadMissing('roles');
return auth()->user()->roles->contains('admin');
}
关系:
public function roles()
{
return $this->hasMany(Role::class);
}
答案 1 :(得分:2)
在您的用户模型上定义isAdmin
方法:
public function isAdmin() {
// simplified your query here
return $this->hasRole('admin');
}
然后它可以在Auth警卫上访问,如:
Auth::user()->isAdmin();