我有一个用户表,它有userRole。我想添加条件以获取所有具有userRole中“ role_id” 1的用户。
用户模型中的关系
public function userRole()
{
return $this->hasOne(UserRole::class);
}
和控制器代码:
$users = User::with(["userRole" => function ($query){
$query->where('role_id', 1);
}])->get();
这不能正常工作。如果其role_id为2,则它将获取所有用户并获取userRole,否则userRole为空。
答案 0 :(得分:1)
这可能会对您有所帮助。请尝试在您的控制器中添加以下代码段
User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get();
答案 1 :(得分:0)
尝试加载反向关系。 像这样:
// in UserRole.php file
public function users()
{
return $this->hasMany(User::class);
}
和您的查询如下:
$role = UserRole::with("users")->where('id', 2)->get();
$users = $role->users;
答案 2 :(得分:0)
有了解决方案,我们可以在哪里做到
User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get();
答案 3 :(得分:0)
说明:
with()
用于渴望加载。因此,基本上使用with('userRole')
将为您提供该特定用户的所有角色。
使用时:
User::with(["userRole" => function ($query){
return $query->where('role_id', 1);
}])->get();
您正在告诉Laravel,请给我所有用户,他们的角色,但所获取的角色应该只有role_id
中的1
。除了这种情况,不要选择其他角色。
Laravel具有函数whereHas
,该函数不会选择任何内容,但会根据孩子的状况过滤父级关系。
例如。我们需要让用户的角色ID为1:
User::wherehas('userRole', function ($q) {
return $q->where('role_id','1');
})->get();
现在,这将告诉Laravel让我获得所有Rolesid为1
的至少1个条目userRoles的用户。
这只会根据角色关系过滤用户。但是,我们需要单独添加with()
子句以获取角色。
User::with('userRole')->wherehas('userRole', function ($q) {
return $q->where('role_id','1');
})->get();