与ManyToMany关系的问题

时间:2015-05-01 16:46:51

标签: symfony doctrine entity

我有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属于哪些软件包,只需要跟踪哪些软件包包含哪些软件包。

2 个答案:

答案 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);
        }
    }    
}