/** * Взять предмет * @param User $user * @param Item $item * @param int $quantityToTake Сколько предметов взять */ public function takeItem(User $user, Item $item, $quantityToTake = 1) { $inventoryItem = $this->inventoryItemRepository->findOneByUserAndItemId($user, $item->getId()); if ($inventoryItem) { $quantity = $inventoryItem->getQuantity() + $quantityToTake; $inventoryItem->setQuantity($quantity); } else { $inventoryItem = new InventoryItem($user, $item, $quantityToTake); $this->inventoryItemRepository->persist($inventoryItem); } $this->inventoryItemRepository->flush($inventoryItem); $this->logger->info(sprintf('[%d]%s взял предмет: [%d]%s x %d шт. (всего %d)', $user->getId(), $user->getName(), $item->getId(), $item->getName(), $quantityToTake, isset($quantity) ? $quantity : $quantityToTake)); }
/** * Взять один или несколько предметов * @param User $user * @param Item|Item[] $items * @param int $quantityToTake Сколько предметов взять */ public function takeItems(User $user, $items, int $quantityToTake = 1) { $itemsToTake = $this->prepareItemsArray($items); $inventoryItems = $this->inventoryItemRepository->findByUser($user); $inventoryItemCollection = new ArrayCollection($inventoryItems); foreach ($itemsToTake as $itemToTake) { $criteria = Criteria::create(); $criteria->where(Criteria::expr()->eq('item', $itemToTake)); $collectedInventoryItem = $inventoryItemCollection->matching($criteria); if ($collectedInventoryItem->count() === 1) { $inventoryItem = $collectedInventoryItem->first(); $quantity = $inventoryItem->getQuantity() + $quantityToTake; $inventoryItem->setQuantity($quantity); } elseif ($collectedInventoryItem->count() === 0) { $inventoryItem = new InventoryItem($user, $itemToTake, $quantityToTake); $this->inventoryItemRepository->persist($inventoryItem); } else { throw new \RuntimeException('Найдено более одного предмета'); } } $this->inventoryItemRepository->flush(); $this->logObtainedItems($user, $itemsToTake, $quantityToTake); }