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(); } }
额外排查方案
如果修复后仍不符合预期,可按以下步骤验证:
- 打印执行的SQL确认条件是否生效,示例代码:
\DB::enableQueryLog(); // 执行查询后输出SQL和绑定参数 dd(\DB::getQueryLog());
- 确认
histories关联的外键package_id、本地键id字段名和数据表实际字段完全一致 - 确认
History模型没有设置全局作用域过滤掉partner_id不为空的记录
内容的提问来源于stack exchange,提问作者M Andre Juliansyah
相关产品推荐
相关产品推荐

