添加条件并联接到Laravel中的连接表

时间:2019-02-23 10:08:42

标签: php mysql laravel join

我有一个用户表,它有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为空。

4 个答案:

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