Laravel Eloquent查询hasMany关联时如何仅返回符合条件的关联行
问题原因
你当前写法的逻辑拆分是两部分:
whereHas闭包的作用是过滤主表Course的查询结果,只保留存在2020年关联offer的课程,不会影响关联数据的查询- 无参数的
with('offer')会把符合条件的课程下的所有关联offer全部查出,所以会出现你遇到的返回全部关联行的问题
解决方法
只需要给with加载的关联也加上同样的年份过滤条件即可,不需要用反向关联查询:
// 写法1:直接在with中增加关联过滤 Course::with(['offer' => function ($query) { $query->where('year', 2020); }]) ->whereHas('offer', function ($query) { $query->where('year', 2020); }) ->get();
如果要避免重复写过滤逻辑,可以把过滤条件抽成公共闭包:
// 写法2:提取公共过滤条件 $filterYear2020 = function ($query) { $query->where('year', 2020); }; Course::with(['offer' => $filterYear2020]) ->whereHas('offer', $filterYear2020) ->get();
执行后返回的结果完全符合需求:
- 主表仅返回有2020年offer的课程(也就是示例中的id=1的课程)
- 关联的offer数据仅保留符合year=2020的行(也就是示例中id=2的offer)
内容的提问来源于stack exchange,提问作者reza
相关产品推荐
相关产品推荐

