Отношения Laravel - где есть HASMany - PullRequest
0 голосов
/ 28 июня 2018
Запись

1 в моей таблице delivery связана с:

  • 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, но я не уверен, что он будет работать без него! Я думаю, что мне нужно запустить whereHas непосредственно в коллекции deliveryItems, но я не могу понять, как это сделать.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете попробовать удалить условие where('entity_id', $this->delivery_id) в методе отношений модели DeliveryItem.

public function stockMovements()
{
    return $this->hasMany(StockMovement::class, 'product_id', 'product_id');
}
0 голосов
/ 28 июня 2018

вы можете попробовать это

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

dd($delivery->deliveryItems);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...