Laravel关系-在哪里有很多

时间:2018-06-28 17:09:19

标签: php laravel eloquent

我的delivery表中的

1个条目与:

  • stock_movements
  • delivery_items

交货有:

public function deliveryItems()
{
    return $this->hasMany(DeliveryItem::class);
}

public function stockMovements()
{
    return $this->hasMany(StockMovement::class,'entity_id');
}

DeliveryItem具有:

public function stockMovements()
{
    return $this->hasMany(StockMovement::class, 'product_id', 'product_id')
        ->where('entity_id', $this->delivery_id);
}

deliveryItems表包含交货中到期的物料清单,stockMovements表包含到期和收到的物料。在某些情况下,我的deliveryItems表中可能有一行,但是stockMovements中没有相关的行。我正在尝试收集这些物品。

我尝试过类似的事情:

$delivery->deliveryItems()->whereHas('stockMovements')->get() //returns empty collection. Can use whereNotHas to get the opposite if it worked.

^^以上返回空集合。

foreach($delivery->deliveryItems as $item){
    dump($item->whereHas('stockMovements')->get());
}

^^这似乎产生正确的结果,但是对于每个循环都产生相同的结果。我不相信我需要foreach,但是不确定如果没有它,它会很热闹!我想我需要直接在deliveryItems集合上运行whereHas,但无法解决该问题。

2 个答案:

答案 0 :(得分:2)

您可以尝试一下

$delivery = Delivery::with(['deliveryItems' => function($query){
                  $query->doesntHave('stockMovements');
              }])->find($deliveryId);

dd($delivery->deliveryItems);

答案 1 :(得分:2)

您可以尝试通过删除where('entity_id', $this->delivery_id)模型的关联方法中的DeliveryItem条件。

public function stockMovements()
{
    return $this->hasMany(StockMovement::class, 'product_id', 'product_id');
}