Laravel中如何访问Pivot关联?获取空Pivot值的orders_material问题
解决Laravel多对多关联中获取Pivot值为Null的关联记录问题
看起来你现在在处理Laravel的多对多关联,想要获取包含Pivot字段为null的orders_material关联记录,但目前返回的关联集合是空的。我来帮你梳理两种常见场景的解决方案:
场景1:获取没有关联任何orders_material的Material记录
如果你的需求是找出完全没有和订单关联的物料(也就是orders_material关联不存在的Material),别用with加载关联,改用whereDoesntHave来筛选主模型:
$materials = Material::whereDoesntHave('orders_material') ->get();
这样就能拿到所有无对应订单关联的物料了。
场景2:获取关联存在但Pivot字段为Null的orders_material记录
如果你的需求是加载Material的orders_material关联,但只保留中间表(Orders_has_Material)中指定字段为null的关联记录,那就在with的闭包里加上whereNull条件,结合你已有的日期筛选:
$material = Material::with(['orders_material' => function($query) use ($begin_date, $end_date) { $query->whereBetween('Orders_has_Material.date_begin', [$begin_date, $end_date]) ->whereBetween('Orders_has_Material.date_final', [$begin_date, $end_date]) // 替换成你需要判断为null的Pivot字段 ->whereNull('Orders_has_Material.date_begin'); }])->get();
如果你的Material模型里已经给orders_material关联设置了withPivot指定要获取的中间表字段,还可以直接用pivot别名筛选:
// 假设关联定义了withPivot('date_begin') $query->whereNull('pivot.date_begin');
额外提示:当前查询返回空集合的原因
你现在的查询是筛选date_begin和date_final都在指定日期范围内的关联记录,如果没有符合该日期条件的关联,自然会返回空集合。如果需要同时包含日期范围内和Pivot字段为null的记录,可以调整条件逻辑:
$material = Material::with(['orders_material' => function($query) use ($begin_date, $end_date) { $query->where(function($q) use ($begin_date, $end_date) { $q->whereBetween('Orders_has_Material.date_begin', [$begin_date, $end_date]) ->whereBetween('Orders_has_Material.date_final', [$begin_date, $end_date]); }) ->orWhereNull('Orders_has_Material.date_begin'); // 新增or条件,包含Pivot字段为null的记录 }])->get();
内容的提问来源于stack exchange,提问作者user8563382
相关产品推荐
相关产品推荐

