Laravel Eloquent如何实现匹配全部指定ID的精准查询?
如何用Laravel Eloquent筛选包含所有指定关联ID的记录?
你当前用whereIn结合whereHas的写法,只会返回至少关联一个指定公司ID的记录,这就是为什么你得到了ID为2和3的结果。要筛选出同时关联所有指定公司ID的记录,有两种可行方案:
方案一:循环叠加whereHas约束
你自己尝试的循环写法是有效的,原理是每次调用whereHas都会给查询添加一个约束,要求模型必须关联对应ID的公司,多次叠加后就会强制模型满足所有关联条件:
foreach($companyIds as $id) { $query->whereHas('companies', function($query) use($id) { $query->where('company_id', $id); }); }
注意:要确保代码里的关联方法名(比如companies)和模型中实际定义的关联方法名一致。
方案二:用whereHas的计数约束(更高效)
如果$companyIds数组元素较多,循环生成多个子查询会影响性能,这时可以用whereHas的第三个参数直接指定关联记录的数量要求:
->whereHas('companies', function($query) use($companyIds) { $query->whereIn('company_id', $companyIds); }, '=', count($companyIds))
这个写法的逻辑是:先筛选出关联公司ID在指定数组中的记录,然后要求这些关联记录的数量恰好等于指定ID的总数,这样就能保证模型关联了所有指定的公司ID(如果少关联一个,计数就会小于数组长度)。
内容的提问来源于stack exchange,提问作者calin24
相关产品推荐
相关产品推荐

