我有两个实体:Cart
和Item
,该关系使用ManyToMany
配置,因为一个购物车可以有多个项目,而一个项目可以在多个购物车中。
所以我有一个链接表item_cart
和item_id
和cart_id
。
我该如何处理数量?例如,如果我需要将带有id = 2
的800个项目添加到带有id = 5
的购物车中?
是否可以在链接表中添加字段数量?
感谢帮助。
最佳答案
您可以通过将关系本身与实体建立关系来实现。该实体称为CartItem
或CartItemLink
。
关联从ManyToMany
和Cart
之间的Item
变为ManyToOne
和OneToMany
两个关联:Cart
-ManyToOne-CartItem
-OneToMany-Item
现在,您可以将其他字段添加到CartItem
中,例如问题中提到的$quantity
字段。
所以这看起来像这样:CartItem
:
class CartItem {
/** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE
* @var Cart
* @ORM\ManyToOne(targetEntity="Application\Entity\Cart", inversedBy="cartItems")
* @ORM\JoinColumn(name="cart_id", referencedColumnName="id")
*/
private $cart;
/** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE
* @var Item
* @ORM\ManyToOne(targetEntity="Application\Entity\Item", inversedBy="cartItems")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id")
*/
private $item;
/**
* @var int
* @ORM\Column(type="integer", nullable=false)
*/
private $quantity;
//.. setters + getters
}
Cart
:class Cart {
/**
* @var integer
* @ORM\Id
* @ORM\Column(type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/** ONE-TO-MANY BIDIRECTIONAL, INVERSE SIDE
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Application\Entity\CartItem", mappedBy="cart")
*/
private $cartItems;
//.. setters + getters
}
Item
:class Item {
/**
* @var integer
* @ORM\Id
* @ORM\Column(type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/** ONE-TO-MANY BIDIRECTIONAL, INVERSE SIDE
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Application\Entity\CartItem", mappedBy="item")
*/
private $cartItems;
//.. setters + getters
}
我没有在
CartItem
中添加ID,因为它可以具有复合键($item_id
+ $cart_id
)或自然键,由您自己决定。$cartItems
和ArrayCollection
中的Don't forget to initialize your Item
Cart
inside the constructor。