[英]Cart feature with Doctrine
我正在尝试在Symfony应用中实现购物车功能。 目的是允许用户在购物车中添加一些事件。
因此,我创建了3个实体。 User
, Event
和Cart
。 用户需要访问他的购物车来获取他的事件。 就像$user->getCart
,它将返回事件的ArrayCollection。
我不知道用教义关系做这件事的最好方法是什么。 我尝试过的所有方法似乎都无效。
到目前为止,这是我所做的:
在我的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
实体中
/**
* @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="cart", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=false)
*/
private $user;
我已经在这里停了下来,因为我觉得我没有采取正确的方法。
我对此有何感想?
尽管我自己还没有测试过,但是很有可能会工作。
实体:
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;
}
}
在进行手推车和电子商务时,您必须记住很多事情,并且需要问自己要保留什么样的信息。 有些人以事件源方式开发购物车模块,因此他们不会丢失任何数据。 格雷格·杨(Greg Young)的演讲在这个主题上很棒。 那是我要使用的方法,但不是最简单的方法。
但是也许您不想保留所有这些有价值的额外状态。 在这种情况下,您可以尝试使用传统的CRUD方法。
使用此功能时,请记住两件事。
Purchase
对象。 由于1,该Purchase
对象不能与Event
有任何关系。 ManyToOne
。 否则,购物车只能是您可以存储在用户中的值对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.