Doctrine 2 ArrayCollection - как найти и изменить конкретный элемент - PullRequest
0 голосов
/ 05 марта 2019

У меня есть объект Cart, который содержит ArrayCollection из CartItems.Отношение в коде -

Cart.php:

class Cart
{
    /**
     * @ORM\OneToMany(targetEntity="CartItem", mappedBy="cart")
     */
    private $cartItems;

    public function __construct(User $user)
    {
        $this->cartItems = new ArrayCollection();
    }
}

CartItems по сути является указателем БД (из-за отсутствия лучшего термина) на сущность Product с дополнительнымquantity field.

CartItem.php:

class CartItem
{
    /**
     * @ORM\ManyToOne(targetEntity="Cart", inversedBy="cartItems")
     */
    private $cart;

    /**
     * @ORM\OneToOne(targetEntity="Product")
     */
    private $product;

    /**
     * @ORM\Column(type="float")
     *
     * @Assert\NotBlank(message="You must specify how much of the item you wish to buy")
     * @Assert\Regex(pattern="/^\d+(\.\d{1,2})?$/", message="The quantity must be a number")
     */
    private $quantity;
}

В моем приложении, когда пользователь хочет добавить Product к своему Cart, я хочу проверить, чтобы увидетьесли этот конкретный Product уже является одним из CartItems.Если это так, я хочу увеличить quantity, в противном случае добавить его в коллекцию.Я не совсем уверен, как это сделать.

ArrayCollection методы exists и contains просто возвращают true / false.Учитывая мои настройки, я не уверен, что бы использовать в качестве ключа для коллекции.

Есть предложения?

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете отфильтровать CartItems для новых Product.Если отфильтрованный CartItems не пустой, увеличьте quantity, в противном случае добавьте новый CartItem.

$newProduct // Product Object 

$cartItems = $cart->getCartItems()->filter(function(CartItem $cartItem) (use $newProduct) {
    return $cartItem->getProduct() === $newProduct;
});

if ($cartItems->count()) {
    foreach ($cartItems as $cartItem) {
        $cartItem->setQuantity($cartItem->getQuantity() + 1);
    }
} else {
    $cart->addCartItem(
        (new CartItem())
            ->setProduct($newProduct)
            ->setQuantity(1)
    );
}
...