Laravel 9中能否用for循环结合WhereHas实现动态数据过滤?
动态生成Laravel多对多关联的筛选条件
你可以通过初始化查询构建器,然后循环遍历$values数组中的每个筛选组,动态添加whereHas子句来实现需求:
$values = [ "0" => ['Dell','hp'], "1" => ['Mac' ,'linux','windows'], "2" => ['12.3' ,'12.5'], "3" => ['8 GB RAM'], ]; // 初始化基础查询 $query = BasicItem::query(); // 遍历每个筛选条件组,动态添加whereHas foreach ($values as $valueSet) { // 跳过空的筛选组(可选,避免无效查询) if (empty($valueSet)) { continue; } $query->whereHas('AttValue', function($subQuery) use ($valueSet) { $subQuery->whereIn('attributeValue', $valueSet); }); } // 获取最终结果 $filteredItems = $query->get();
说明:
- 这种方式会为
$values中的每个数组元素生成一个独立的whereHas条件,和你手动编写的静态代码逻辑完全一致。 - 每个
whereHas确保BasicItem模型必须关联至少一个符合当前筛选组条件的AttValue记录。 - 可选的空数组检查可以避免添加无意义的筛选条件,提升查询效率。
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

