在多对多关系中使用“And Where”
Posted
技术标签:
【中文标题】在多对多关系中使用“And Where”【英文标题】:using 'And Where' in Many to Many relation 【发布时间】:2021-02-18 00:44:16 【问题描述】:我有两个具有多对多关系的模型。
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 有关系的所有用户?
【问题讨论】:
【参考方案1】:您提供的代码没有多大意义,但根据您的解释,您希望找到与汽车 1 和 3 和有关系的用户> 6. 使用whereIn()
让您的用户与汽车 1 或 3 或 6有关系。
您尝试使用多个where()
过滤器将不起作用,因为这将在数据透视表中查找包含多辆汽车的单行,这显然是不可能的。相反,您需要将多个 whereHas()
relationship filters 嵌套到 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 标准正确设置了关系和表格。
演示代码在这里:https://implode.io/anjLGG
【讨论】:
是的,这就是我想要的......是的,这是我的案例的答案。谢谢你.. 对此感到抱歉。我在这里几乎是新手..我找不到接受您的答案的方法..我也看不到✅。并且有某人的错误回复作为答案。我可以说我没有接受那个错误的代码。我事件评论说这是不正确的。无论如何,很抱歉给了某种伤害……但无论如何都不能接受你的伤害。这就是为什么我评论了你的 ID 和答案。如果你让我知道如何纠正这个问题,我会这样做。谢谢。【参考方案2】:可以使用whereHas
方法查询关系:
use Illuminate\Database\Eloquent\Builder;
User::whereHas('cars', function (Builder $builder) use($car_selected)
$builder->whereIn( 'cars.id', $car_selected);
)->get();
欲了解更多信息,请查看doc
【讨论】:
感谢您的回复.. 但这就是我现在想要的。使用“WhereIn”无法获得相交的行。请仔细阅读我的问题.. 那么您所说的 'This give Combination because of 'whereIn' condition' 是什么意思。你面临什么问题?【参考方案3】:正如@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();
谢谢。
【讨论】:
以上是关于在多对多关系中使用“And Where”的主要内容,如果未能解决你的问题,请参考以下文章