一对多查询 where 有 returns 不需要的结果

one to many query with where Has returns unwanted results

我有一个问题,但没有找到正确的解决方案:

    $orders = Shipping::with('orderitems')
        ->whereHas('orderitems',  function($query)  {
            $query->where('status','=',NULL);
        })
        ->paginate(10);

我正在查询一对多关系

public function orderitems() {
    return $this->hasMany('OrderItems');
}

当 'orderItems' 中的所有条目都符合条件且状态为 'NULL' 时,上面的查询 returns 是正确的结果集。问题是,当我有一个包含 2 个项目的订单并且两个项目中的一个没有状态 'NULL' 时,两个项目都被退回,尽管我只想要实际具有状态 'NULL' 的项目被退回.

我试过使用 whereNested 查询和查询范围,但我认为这不是解决问题的方法。有人可以帮忙吗?

whereHas 实际上会根据是否有至少一个 orderitem 符合条件来过滤 Shipping。我很确定你想要的是使用 with 条件:

$orders = Shipping::with(['orderitems' => function($query){
    $query->where('status','=',NULL);
}])->paginate(10);

编辑

如果您还只想订购至少一件状态为 NULL:

的商品,请添加 whereHas
$orders = Shipping::with(['orderitems' => function($query){
    $query->where('status','=',NULL);
}])->whereHas('orderitems',  function($query){
    $query->where('status','=',NULL);
})->paginate(10);