【发布时间】:2015-05-01 16:46:50
【问题描述】:
我有 2 个实体。
一个包和一个 StockItem。
Package 可以有多个 StockItem,StockItem 可以属于 Many packages。 ManyToMany 似乎最合适。
当我尝试将 2 个相同的库存商品添加到一个包裹中时,会出现此问题,我们会遇到 Integraty 违规:
{"code":500,"message":"An exception occurred while executing 'INSERT INTO StockItem_In_Package (package_id, stockitem_id) VALUES (?, ?)' with params [4, 1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4-1' for key 'PRIMARY'"}
由于 Package(id 4),与 stockItem 1 创建 2 个关系。
4-1 和 4-1
有没有可能以任何方式解决这个问题? 是否可以将名为 id 的第三列添加到 ManyToMany 表,或者添加一个名为 ItemCountInPackage 的列,并在将其添加到包中时将其增加一?什么是最好的解决方案。
封装实体,只插入相关代码:
/**
* Package
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="IHEnterprise\LogisticsBundle\Entity\PackageRepository")
* @ORM\HasLifecycleCallbacks
*
* @ExclusionPolicy("all")
*
*/
class Package
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity="IHEnterprise\LogisticsBundle\Entity\StockItem", cascade={"all"}, indexBy="package_id")
* @ORM\JoinTable(name="StockItem_In_Package",
* joinColumns={@ORM\JoinColumn(name="package_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="stockitem_id", referencedColumnName="id")}
* )
* @Expose
* @Assert\NotNull()
**/
private $stockItems;
}
StockItem 实体,只插入相关代码:
/**
* StockItem
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="IHEnterprise\LogisticsBundle\Entity\StockItemRepository")
* @ORM\HasLifecycleCallbacks
*
* @ExclusionPolicy("all")
*
*/
class StockItem
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose
*/
private $id;
}
我不需要跟踪哪些 StockItems 属于哪些包裹,只需要跟踪哪些包裹包含哪些 stockitems。
【问题讨论】: