Laravel Eloquent使用with关联查询如何仅返回指定的关联items
问题原因
- 第一段代码的问题:
whereHas仅用于筛选「存在符合要求关联项的分类」,不会限制with()加载的关联数据范围,所以会返回分类下的所有item - 第二段代码的问题:循环叠加
whereHas相当于要求分类必须同时包含所有你传入的选中item,只要缺一个就不会返回该分类,自然容易出现结果为空的情况
正确写法
给 with() 也加上关联过滤条件即可,代码如下:
$reqItems = $request->items; //array - selected item $categories = Category::where('type_id', 1) ->whereHas('items', function ($query) use ($reqItems){ $query->whereIn('id', $reqItems); }) ->with(['items' => function ($query) use ($reqItems) { // 这里限制只加载选中的item $query->whereIn('id', $reqItems); }]) ->get();
逻辑说明
上述代码同时实现两层过滤:
whereHas部分:只返回至少包含一个选中item的分类,排除完全没有符合要求关联项的分类with闭包部分:仅加载每个分类下属于你选中列表的item,不会返回其他无关数据
如果你不需要过滤分类(哪怕分类下没有选中项也需要返回分类,只是关联item字段为空),直接删除whereHas部分即可。
内容的提问来源于stack exchange,提问作者user3613026
相关产品推荐
相关产品推荐

