在多对多关系中使用'And Where'



我有两个具有多对多关系的模型。

class User extends Model
{
function cars()
{
return $this->belongsToMany(Car::class);
}
}
class Car extends Model
{
function users()
{
return $this->belongsToMany(User::class);
}
}

我想让用户谁使用了一套特定的汽车:

$car_selected = [1, 3, 6];
$users = User::when(count($car_selected) > 0, function ($q) use ($car_selected) {
$q->whereIn('cars.id', $car_selected);
})
->get();

由于"whereIn"条件的原因,这会产生太多结果;我想要的是"在哪里"的东西。

我试过了,但没有成功。

$users = User::when(count($car_selected) > 0, function ($q) use ($car_selected) {
foreach($car_selected as $xx) {
$q->where( 'cars.id', $xx);
}
})
->get();

如何获取与汽车1、3和6有关系的所有用户?

您提供的代码没有多大意义,但根据您的解释,您希望找到一个与汽车13以及6有关系的用户。使用whereIn()可以让用户与汽车13或者6建立关系。

您尝试使用多个where()过滤器是行不通的,因为这将在具有多个汽车的数据透视表中查找一行,这显然是不可能的。相反,您需要将多个whereHas()关系过滤器嵌套到一个where()组中,如下所示:

$users = User::where(function ($q) use ($car_selected) {
foreach ($car_selected as $car) {
$q->whereHas('cars', function ($query) use ($car) {
$query->where('car_id', $car);
});
}
})
->with(['cars' => function ($q) use ($car_selected) {
$q->whereIn('car_id', $car_selected);
}])
->get();

这一切都是假设你已经按照Laravel标准正确地设置了你的关系和表格。

演示代码在这里:https://implode.io/anjLGG

您可以使用whereHas方法查询关系:

use IlluminateDatabaseEloquentBuilder;
User::whereHas('cars', function (Builder $builder) use($car_selected)
{
$builder->whereIn( 'cars.id', $car_selected);
})->get();

有关更多信息,请查看文档

正如@miken32所解释的,我需要将多个whereHas((关系过滤器嵌套到一个where((组中。

@miken32建议如下。。


$users = User::where(function ($q) use ($car_selected) {
foreach ($car_selected as $car) {
$q->whereHas('cars', function ($query) use ($car) {
$query->where('car_id', $car);
});
}
})
->with(['cars' => function ($q) use ($car_selected) {
$q->whereIn('car_id', $car_selected);
}])
->get();

我想下面就足够了。


$users = User::where(function ($q) use ($car_selected) {
foreach ($car_selected as $car) {
$q->whereHas('cars', function ($query) use ($car) {
$query->where('car_id', $car);
});
}
})->get();

谢谢。

最新更新