Функция корзины с доктриной - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь реализовать функцию корзины в моем приложении Symfony.Цель состоит в том, чтобы позволить пользователю добавлять некоторые события в корзину.

Итак, я создал 3 сущности.User, Event и Cart.Пользователь должен получить доступ к своей корзине, чтобы получить его события.Как и $user->getCart, который будет возвращать ArrayCollection событий.

Я понятия не имею, как лучше всего это сделать с помощью отношения Doctrine.Все, что я пробовал, похоже, не работает.

Вот что я сделал до сих пор:

В моем User Сущности

/**
* @ORM\OneToOne(targetEntity="App\Entity\Cart", mappedBy="user", cascade={"persist", "remove"})
*/
private $cart;

public function getCart(): ?Cart
{
    return $this->cart;
}

public function setCart(Cart $cart): self
{
    $this->cart = $cart;

    // set the owning side of the relation if necessary
    if ($this !== $cart->getUser()) {
        $cart->setUser($this);
    }

    return $this;
}

В моем User Entity

/**
* @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="cart", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $user;

Я остановился здесь, потому что чувствую, что не правильно делаю подход.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

При работе с телегами и электронными товарами вам нужно помнить о многих вещах и спрашивать себя, какую информацию вы хотите сохранить.Некоторые люди разрабатывают модули Cart на основе источников событий, чтобы не терять данные.Этот разговор Грега Янга великолепен в этом вопросе.Это подход, который я бы использовал, но он не самый простой.

Но, возможно, вы не хотите сохранять все это ценное дополнительное состояние.В этом случае вы можете использовать традиционный подход CRUD, как вы пытаетесь.

При использовании этого, имейте в виду две вещи.

  1. Ваши события изменчивы.Цена может измениться, местоположение может измениться, время может измениться.
  2. Когда покупка будет завершена, вы возьмете эту корзину и сгенерируете из нее объект Purchase.Этот объект Purchase НЕ МОЖЕТ иметь никакого отношения к Event, потому что 1.
  3. Вы не хотите, чтобы у пользователя была одна Корзина, я думаю.Пользователь может иметь много Тележек, поэтому, возможно, вам следует сделать это отношение ManyToOne на стороне корзины.В противном случае Cart может быть просто объектом-значением, который вы можете сохранить в пользователе.
0 голосов
/ 15 октября 2018

Хотя я сам не проверял его, он, скорее всего, будет работать.

Сущности:

class User
{
    ...

    /**
     * @ORM\OneToMany(targetEntity="Cart", mappedBy="user", cascade={"persist"})
     */
    private $carts;

    public function __construct()
    {
        $this->carts = new ArrayCollection();
    }

    public function addCart(Cart $cart): self
    {
        $this->carts[] = $cart;

        return $this;
    }

    public function removeCart(Cart $cart): bool
    {
        return $this->carts->removeElement($cart);
    }

    public function getCarts(): Collection
    {
        return $this->carts;
    }
}

class Cart
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="carts", cascade={"persist"})
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="Event", mappedBy="cart", cascade={"persist"})
     */
    private $events;

    public function __construct()
    {
        $this->events = new ArrayCollection();
    }

    public function setUser(User $user): self
    {
        $this->user = $user;

        return $this;
    }

    public function getUser(): User
    {
        return $this->user;
    }

    public function addEvent(Event $event): self
    {
        $this->events[] = $event;

        return $this;
    }

    public function removeEvent(Event $event): bool
    {
        return $this->events->removeElement($event);
    }

    public function getEvents(): Collection
    {
        return $this->events;
    }
}

class Event
{
    ...

    /**
     * @ORM\ManyToOne(targetEntity="Cart", inversedBy="events", cascade={"persist"})
     * @ORM\JoinColumn(name="cart_id", referencedColumnName="id", nullable=false)
     */
    private $cart;

    public function setCart(Cart $cart): self
    {
        $this->cart = $cart;

        return $this;
    }

    public function getCart(): User
    {
        return $this->cart;
    }
}
...