在Doctrine flush中插入之前删除

时间:2014-03-07 12:49:01

标签: php mysql symfony doctrine-orm

我有一个Case实体,可以有多个Floors(OneToMany),每个Floor都有一个FloorType,指定它的类型。我的Floors实体上也有一个UniqueConstraint,它不允许每个Case的两个FloType具有相同的FloorType。

为了在每个Case中插入Floors,我为Floors创建了一个Symfony Collection类型,并使用js向我的Case添加了新的Floors。

Symfony的表单集合文档说,如果某个项目未提交,它将自动从数据库中删除。

现在问题是如果我已经在DB中有一个Case的Floors,当我在我的表单中删除Floor并再次添加它时,它将被视为一个新的INSERT,但是因为Doctrine通过执行来执行刷新首先是INSERT,最后是DELETE,我会因违反我设置的uniqueConstraint而得到以下错误:

  

SQLSTATE [23000]:完整性约束违规:1062重复条目'floors_case_floor_type_unique'重复输入'4-2'

这意味着在尝试从同一个表中删除最后一个之前,Doctrine正试图将一行插入到Floors表中,其中FloorType与删除的一样。

有任何方法可以让教义在INSERT之前执行DELETE,还是以任何其他方式解决此问题?

1 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是FormEvent 我建议你register your FormType as a service,这样你就可以注入教条

# in your services.yml:
services:
    yourbundle.form.case_type:
        class: Your\Bundle\CaseType
        arguments: ["@doctrine"]
        tags:
            - { name: form.type, alias: your_bundle_case_type }

并扩展您的 FormType

class CaseType /*...*/
{
    private $doctrine;

    public function __construct($doctrine)
    {
        $this->doctrine = $doctrine;
    }
}

现在在buildForm的{​​{1}}方法中注册 EventListener

CaseType