在多对多关系中使用 '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();

谢谢。