Я бы посоветовал вычесть проданные вещи сразу из Product::available_items
.Это решит проблему сразу, потому что Product::available_items
всегда будет отражать количество доступных предметов.
Метод №.1
Сразу же вычтите Sale::quantity
из Product
.
public function setProduct(ProductInterface $product)
{
$new_count = $product->getAvailableItems() - $this->getQuantity();
$product->setAvailableItems($new_count);
$this->product = $product;
}
Вы также должны будете выполнить вычитание во всех контроллерах, которые могут изменить доступное количество элементов.
Метод №.2
Лично я на самом деле предпочел бы этот метод первому, потому что он хранит логику в одном месте и, как правило, приводит к более коротким контроллерам.Кроме того, мои сущности обычно достаточно длинные без всей логики домена.
Предполагая, что Sale
имеет ссылку на Product
, я бы поместил логику в службу (менеджер сущностей, ориентированный на сущность,например, UserManager
. В нашем случае это будет называться SaleManager
).Метод в нем будет выглядеть примерно так:
public function updateSale(SaleInterface $sale, $flush = true)
{
$product = $sale->getProduct();
$new_count = $product->getAvailableItems() - $sale->getQuantity();
if ($new_count < 0) {
throw new NegativeQuantityException();
}
$product->setAvailableItems($new_count);
$this->em->persist($sale);
if (true === $flush) {
$this->em->flush();
}
}
Я не затрагивал вопрос о том, что произойдет, если вы удалите Sale
из Product
или переключите Product in a sale
, но вы, конечно, должны это учитывать.