如何在Laravel多对多关联的中间表上应用筛选条件查询
问题原因
你当前使用的with()方法属于预加载约束,仅会过滤关联模型categories返回的内容,不会对主模型Listing的查询结果做筛选,所以才会返回所有Listing记录,只是不符合分类条件的记录关联的categories是空数组而已。
正确实现方案
需要配合whereHas()方法来筛选关联了指定分类的主模型记录,代码修改如下:
if($request->categories){ $var = $request->categories; // 数组格式,例如[1,2,3] $lists = Listing::with(['categories' => function ($query) use($var) { $query->whereIn('category_id',$var); }]) ->whereHas('categories', function ($query) use($var) { $query->whereIn('category_id', $var); }) ->get(); dd($lists); }
场景补充说明
- 如果你需要返回的
Listing记录里的categories关联只包含你筛选的指定分类:保留with里的闭包约束即可 - 如果你需要返回的
Listing记录里的categories关联包含该记录关联的全部分类:with直接写关联名with('categories')不需要加闭包约束 - 如果你需要筛选同时关联所有指定分类的
Listing(不是只要关联其中任意一个),可以给whereHas加数量匹配参数:
->whereHas('categories', function ($query) use($var) { $query->whereIn('category_id', $var); }, '=', count($var))
内容的提问来源于stack exchange,提问作者Black core
相关产品推荐
相关产品推荐

