在多对多关系中使用 'And Where'
using 'And Where' in Many to Many relation
我有两个具有多对多关系的模型。
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' 条件,这给出了太多结果;我想要的是 'whereAnd' 东西。
我试过了,但没有成功。
$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 有关系的所有用户?
可以使用whereHas
方法查询关系:
use Illuminate\Database\Eloquent\Builder;
User::whereHas('cars', function (Builder $builder) use($car_selected)
{
$builder->whereIn( 'cars.id', $car_selected);
})->get();
有关更多信息,请查看 doc
您提供的代码没有多大意义,但根据您的解释,您想找到与汽车有关系的用户 1 and 3 and 6. 使用 whereIn()
让您的用户与汽车 1 or 3 or 6.
您尝试使用多个 where()
过滤器是行不通的,因为这将在具有多辆汽车的枢轴 table 中寻找单行,这显然是不可能的。相反,您需要像这样嵌套多个 whereHas()
relationship filters into a single where()
group:
$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 标准正确建立关系和 tables。
演示代码在这里:https://implode.io/anjLGG
正如@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();
谢谢。
我有两个具有多对多关系的模型。
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' 条件,这给出了太多结果;我想要的是 'whereAnd' 东西。
我试过了,但没有成功。
$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 有关系的所有用户?
可以使用whereHas
方法查询关系:
use Illuminate\Database\Eloquent\Builder;
User::whereHas('cars', function (Builder $builder) use($car_selected)
{
$builder->whereIn( 'cars.id', $car_selected);
})->get();
有关更多信息,请查看 doc
您提供的代码没有多大意义,但根据您的解释,您想找到与汽车有关系的用户 1 and 3 and 6. 使用 whereIn()
让您的用户与汽车 1 or 3 or 6.
您尝试使用多个 where()
过滤器是行不通的,因为这将在具有多辆汽车的枢轴 table 中寻找单行,这显然是不可能的。相反,您需要像这样嵌套多个 whereHas()
relationship filters into a single where()
group:
$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 标准正确建立关系和 tables。
演示代码在这里:https://implode.io/anjLGG
正如@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();
谢谢。