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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:10:37