You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:15:02