Laravel一对多关联下Eager Loading如何过滤C表匹配主地点的关联数据
你的现有写法不符合需求,默认with('C')会加载A关联的所有C表条目,无法自动过滤出c.location_id = a.main_location_id的条目,该需求可以实现,以下是两种常用实现方案:
方案1:新增专属关联(推荐,复用性高)
直接在A模型中定义一个专门匹配主地点C表条目的一对一关联,后续所有需要取主地点C数据的场景都可以直接调用:
// app/Models/A.php public function mainLocationC() { return $this->hasOne(C::class) // 关联条件匹配主地点ID ->whereColumn('c.location_id', 'a.main_location_id') // 按需选择返回字段,必须保留关联外键a_id ->select('a_id', 'location_id', 'total_qty', 'aval_qty'); }
查询代码调整为:
A::with(['B', 'mainLocationC']) ->where('id', 1) ->first();
最终返回结果中mainLocationC属性就是你需要的符合条件的C表条目。
方案2:单条查询懒加载(适合临时单次查询场景)
如果你仅需要在当前这一处查询实现该逻辑,不想新增关联,可以先查询A表数据,再传入主地点ID过滤关联的C表数据:
// 先查询目标A记录 $a = A::where('id', 1)->first(); // 懒加载关联,传入A的主地点ID过滤C表 $a->load(['B', 'C' => function ($query) use ($a) { $query->where('location_id', $a->main_location_id) ->select('location_id', 'total_qty', 'aval_qty'); }]);
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

