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

Laravel中使用WhereHas查询HasMany关联数据无效果如何解决

问题原因
  • 核心错误:你所有的查询筛选条件都添加给了局部变量$query,但最终执行分页查询时调用的是类属性$this->query,二者不是同一个对象,所以你写的whereHas等筛选逻辑完全没有生效
  • 次要问题:初始化查询构造器的写法不规范,new Package()是实例化模型对象,正确启动查询构造器应该用Package::query()静态方法
修复后的代码
public function getIncomeMPW(Request $request)
{
    if ($request->expectsJson()) {
        $this->getSearch($request);
        // 正确初始化查询构造器
        $query = Package::query();
        $query->with(['histories', 'items', 'items.prices', 'origin_regency', 'origin_district', 'origin_sub_district', 'destination_regency', 'destination_district', 'destination_sub_district', 'code', 'attachments']);

        $query->whereHas('histories', function (Builder $query) {
            $query->whereNotNull('partner_id');
        });

        $query->orderBy('created_at', 'desc');
        // 调用添加了筛选条件的局部变量$query执行分页
        return (new Response(Response::RC_SUCCESS, $query->paginate(request('per_page', 15))))->json();
    }

}
额外排查方案

如果修复后仍不符合预期,可按以下步骤验证:

  1. 打印执行的SQL确认条件是否生效,示例代码:
\DB::enableQueryLog();
// 执行查询后输出SQL和绑定参数
dd(\DB::getQueryLog());
  1. 确认histories关联的外键package_id、本地键id字段名和数据表实际字段完全一致
  2. 确认History模型没有设置全局作用域过滤掉partner_id不为空的记录

内容的提问来源于stack exchange,提问作者M Andre Juliansyah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:45:00