Laravel _如何将查询注入Auth :: user()

时间:2018-02-02 15:49:23

标签: php laravel

我正在制作一个带有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的初学者。你能救我吗?

2 个答案:

答案 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();