在BelongsToMany关系中使用withWhereHas方法,可以通过在关联查询闭包中添加条件来筛选结果。
例如,如果有一个用户模型和一个角色模型,其中用户可以拥有多个角色,而角色也可以与多个用户关联,可以定义以下关系:
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
class Role extends Model
{
public function users()
{
return $this->belongsToMany(User::class);
}
}
现在假设我们想要获取所有拥有名称为"admin"的角色的用户。我们需要对关联查询闭包中的query参数使用withWhereHas方法。
$users = User::with('roles')
->whereHas('roles', function ($query) {
$query->where('name', 'admin');
})
->get();
这可以使用whereHas方法完成,但是如果想要进一步筛选关联的角色,可以使用withWhereHas方法:
$users = User::with(['roles' => function ($query) {
$query->where('status', 'active');
}])
->whereHas('roles', function ($query) {
$query->where('name', 'admin');
}, '>=', 2)
->get();
在此示例中,我们还使用whereHas的第三个参数传递了匹配计数器。在此情况下,我们只检索拥有至少两个名称为"admin"的角色的用户。