Laravel 5 - 使用' isAdmin'查询模型时的角色检查方法

时间:2017-07-04 10:59:50

标签: laravel laravel-5 eloquent laravel-spark

我已经实现了一个使用表' role_user'的基本角色系统。

在我的用户模型上,我有一些检查角色的方法,其中之一是:

public function isStaff()
{
    foreach ($this->roles()->get() as $role)
    {
        if ($role->id == 3)
        {
            return true;
        }
    }

    return false;
}

我在查询用户时如何使用此方法?

此查询:

return User::where('name', 'like', "%".$request->name."%")
    ->orWhere('email', 'like', "%".$request->name."%")
    ->whereDoesntHave('Teams', function ($query) use($teamId) {
        $query->whereId($teamId);
    })
    ->with('teams')
    ->get();

目前返回所有用户,但我只希望返回角色为3的用户(isStaff)

3 个答案:

答案 0 :(得分:1)

您可以使用Scopes With Laravel而不是多种方法来检查不同的方法。

public function scopeRole($query, $flag)
{
        return $query->where('role', $flag);
}

然后

$users= User::role(3)->get();

检查reference tutorial创建动态范围

答案 1 :(得分:0)

做条件更好

return User::where('name', 'like', "%".$request->name."%")
->orWhere('email', 'like', "%".$request->name."%")
->whereDoesntHave('Teams', function ($query) use($teamId) {
    $query->whereId($teamId);
})
->whereHas('roles', function($q) use ($role_id){
    $q->where('id',$role_id);
})
->with('teams')
->get();

或者您也可以为上述查询创建方法并基于参数重新生成结果

答案 2 :(得分:0)

您可以在staff模型中设置名为User的范围,然后使用该范围缩小搜索范围:

public function scopeStaff($query, $roll_id = 3) 
{
    return $query->where('role_id', '=', $roll_id)
}

因此,在检查(使用模型)人员角色时,您可以改进执行此操作的功能:

public function isStaff($role_id = 3)
{
    return $this->role_id = $role_id ? $this : false;
}

因此,在使用查询构建器时,您可以使用第一种方法将结果缩小到具有指定ID的那些,因为您可以看到默认值为3,但会更改为您给出的任何值:

$staff_users = User::staff()->get();

然后另一个用于验证匹配的用户模型是否是员工:

$user = User::find(1);
$is_staff = $user->isStaff(); //false or returns the same model

希望这有帮助