Symfony + Doctrine - UnitOfWork提交订单

时间:2013-09-15 10:14:18

标签: symfony doctrine-orm

我有一个显示实体的表单:

class Event
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * 
     * @ORM\OneToMany(targetEntity="EventAttendee", mappedBy="event", cascade={"all"})
     */
    private $attendees;
}

及其中的一个集合:

class EventAttendee
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * 
     * @ORM\ManyToOne(targetEntity="Event", inversedBy="attendees")
     * @ORM\JoinColumn(name="event_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $event;

    /**
     * 
     * @ORM\OneToOne(targetEntity="Employee")
     * @ORM\JoinColumn(name="employee_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $employee;
}

如果我从集合中删除了一个员工并再次添加,我就会违反完整性约束。这是因为Doctrine的UnitOfWork首先执行Inserts然后删除。因此,当它插入新记录时,db仍然具有同一雇员的旧记录。

Doctrine2开发人员没有为Symfony2用户提供任何有用的解决方案(这里是主题:http://www.doctrine-project.org/jira/browse/DDC-601)。

因此,我在这里问这个问题:无论如何可以避免这个问题吗?

编辑:

我目前的解决方法是:

  1. 找到所有准备插入的非持续收集项目
  2. 将其从集合中删除并保存到变量
  3. 删除表单
  4. 中真正删除的所有项目
  5. call flush()
  6. 将所有要插入的项目添加回集合
  7. call flush()
  8. 这对我有用,但看起来不太好。也许某人有更好的解决方案。

0 个答案:

没有答案