我有两个具有多对多关系的模型。
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有关系的所有用户?
您提供的代码没有多大意义,但根据您的解释,您希望找到一个与汽车1和3以及6有关系的用户。使用whereIn()
可以让用户与汽车1或3或者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();
谢谢。