我有2次进入。
包和StockItem。
Package可以有很多StockItems,StockItem可以属于很多包。 ManyToMany似乎最合适。
当我尝试将2个相同的stockitems添加到包中时出现问题,我们收到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
有可能以任何方式解决这个问题吗? 是否可以在ManyToMany表中添加名为id的第三列,或者添加一个名为ItemCountInPackage的列,并在将相同的值添加到包时将其递增1?什么是最好的解决方案。
包实体,仅插入相关代码:
/**
* 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 Entity,只插入相关代码:
/**
* 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属于哪些软件包,只需要跟踪哪些软件包包含哪些软件包。
答案 0 :(得分:1)
您无法在ManyToMany关系中添加第三列。因此,您无法在一个包中拥有相同的StockItem两次。
要在一个包中拥有同一个StockItem的多个部分,您必须创建一个具有唯一ID的第三个实体,以及与StockItem和Package的ManyToOne关系(以及StockItem和Package中的OneToMany关系到您的第三个实体)。
答案 1 :(得分:0)
看起来您正在尝试将已存在于数据库中的项目作为新记录插入。要防止出现此类错误,请执行以下操作:
/**
* @desc Add only new items to a single package
* @param \AcmeBundle\Entity\Package $package
* @param ArrayCollection<StockItem> $stockItems
*/
public function addStockItemsAction(Package $package, $stockItems) {
foreach ($stockItems as $stockItem) {
if ($package->contains($stockItem) === false) {
$package->addStockItem($stockItem);
}
}
}