如何查询关联Products模型含指定type属性值的Category分类
问题分析与解决方法
原代码错误点
- 执行逻辑不合理:先全量查询所有分类再在PHP内存中过滤,数据量较大时会产生严重的性能损耗
- 返回值判断错误:集合
where方法返回的是满足条件的子集,即使子集为空也会被判定为布尔真,导致过滤逻辑失效 - 细节错误:一是字段名不匹配,需求中products表的对应字段为
type,代码中误写为type_id;二是集合判断存在的方法为contains,拼写错误写成了contain
最优解决方案(数据库层面筛选,推荐)
使用Laravel提供的whereHas关联查询方法,直接在SQL层面完成筛选,性能更高:
// 筛选出存在type=1的关联产品的分类,同时预加载这些分类下所有type=1的产品 return Category::whereHas('products', function ($query) { $query->where('type', 1); })->with(['products' => function ($query) { $query->where('type', 1); }])->get();
如果不需要返回关联产品数据,删除with部分即可。
集合过滤修正方案(仅适用于小数据量场景)
如果确实需要先拉取全量分类再做过滤,修正写法如下:
return Category::with('products')->get()->filter(function ($category) { // 判断关联产品集合中是否存在type=1的项 return $category->products->contains('type', 1); });
内容的提问来源于stack exchange,提问作者Mehdi Yaghoubi
相关产品推荐
相关产品推荐

