我已经实现了一个使用表' 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)
答案 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
希望这有帮助