Laravel Eloquent过滤嵌套关联 移除product_related为空的cross_selling项
调整方案
with()方法仅实现关联预加载和子关联的条件过滤,不会对上层cross_selling关联的条目做存在性校验,要过滤掉product_related为空的cross_selling条目,需要额外对cross_selling关联加whereHas约束,同时保留原有的预加载逻辑:
Laravel 8及以上通用写法
$products = Product::with(['cross_selling' => function ($query) { // 仅保留存在符合条件的product_related的cross_selling条目 $query->whereHas('product_related', fn ($q) => $q->where('status_id', 2)) // 预加载符合条件的product_related数据 ->with(['product_related' => fn ($q) => $q->where('status_id', 2)]); }])->where('status_id', 2)->get();
Laravel 9+简化写法
可以用withWhereHas方法合并whereHas和带条件预加载的逻辑,代码更简洁:
$products = Product::with(['cross_selling' => fn ($query) => $query->withWhereHas('product_related', fn ($q) => $q->where('status_id', 2)) ])->where('status_id', 2)->get();
内容的提问来源于stack exchange,提问作者Fryla- Cristian Marucci
相关产品推荐
相关产品推荐

