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

Laravel预加载子关联为空时如何返回空结果而非父表数据

问题原因

你当前只使用了with方法做关联预加载,该方法仅负责将满足条件的关联数据挂载到返回的父模型实例上,不会限制父模型的查询结果,因此子表无匹配关联数据时,依然会返回父表数据,仅关联字段为空数组。

解决方案

要实现「仅返回存在符合条件的子关联数据的父表记录」的需求,需要同时使用whereHas方法做关联存在性校验,搭配with预加载关联数据即可。
修改后的代码如下:

// 把关联过滤条件抽成公共闭包,避免两处写重复逻辑
$branchFilter = function ($query) {
    $query->where('branch_id', 2);
};

$options = PosReceipt::with(['transferBranch' => $branchFilter])
    // 新增whereHas校验,仅保留存在符合条件的transferBranch关联的父表记录
    ->whereHas('transferBranch', $branchFilter)
    ->where('receipt_no','LIKE','%'.$filters->keyword.'%')
    ->whereDate('receipt_date','>=', $date1)
    ->whereDate('receipt_date','<=', $date2)
    ->where('type', 'TRN')
    ->limit(20)
    ->offset($request->start)
    ->orderBy('id','DESC')
    ->get();

补充说明

  • whereHas方法会自动基于关联关系做EXISTS子查询,只有当子表存在至少一条符合闭包条件的关联记录时,对应的父表记录才会被保留
  • 最终返回的结果中如果没有符合条件的记录,会直接返回空集合,符合你要求的无子关联数据时整体返回空的需求
  • 如果需要直接返回数组格式,可以在get()后链式调用->toArray()方法即可
  • 后续如果需要调整关联的过滤条件,只需要修改$branchFilter闭包即可,不需要两处同步修改,降低维护成本

内容的提问来源于stack exchange,提问作者Muhammad Ibrahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:05