Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在插入之前删除_Php_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

Php 在插入之前删除

Php 在插入之前删除,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,我有一个案例实体,它可以有多个楼层(一个楼层),每个楼层都有一个指定其类型的FloorType。我的Floors实体上还有一个UniqueConstraint,它不允许每个案例有两个相同FloorType的楼层 为了在每个案例中插入楼层,我为楼层创建了一个Symfony集合类型,并使用js将新楼层添加到案例中 Symfony的表单集合文档表示,如果某个项目未提交,它将自动从DB中删除 现在的问题是,如果我已经在DB中为一个案例设置了一个楼层,当我在表格中删除该楼层并再次添加它时,它将被视为一个新

我有一个案例实体,它可以有多个楼层(一个楼层),每个楼层都有一个指定其类型的FloorType。我的Floors实体上还有一个UniqueConstraint,它不允许每个案例有两个相同FloorType的楼层

为了在每个案例中插入楼层,我为楼层创建了一个Symfony集合类型,并使用js将新楼层添加到案例中

Symfony的表单集合文档表示,如果某个项目未提交,它将自动从DB中删除

现在的问题是,如果我已经在DB中为一个案例设置了一个楼层,当我在表格中删除该楼层并再次添加它时,它将被视为一个新的插入,但由于条令先执行插入,最后执行删除,因此我会因违反我设置的uniqueConstraint而得到以下错误:

SQLSTATE[23000]:完整性约束冲突:1062项“floors\u case\u floor\u type\u unique”的重复条目“4-2”

这意味着,在尝试从同一个表中删除最后一行之前,条令试图在Floors表中插入一行,该行的FloorType与删除的行相同


有没有办法让条令先删除再插入,或者有没有其他办法解决这个问题?

一种方法是a。
我建议你这样你就可以:

并扩展您的FormType:

现在在您的
CaseType
buildForm
方法中注册一个EventListener:

$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
     $data = $event->getData();
     $em  = $this->doctrine->getEntityManager();

     foreach ($data['floor'] as $floor) {
         // delete floors here...
         $duplicateFloor = $em->find('YourBundle:Floor', $floor->getId);
         $em->remove($duplicateFloor);
     }
     $em->flush();
});

我试图手动移除地板,不是在事件中,而是在表单验证后在我的控制器中。但问题是,如果我在拆除地板后进行冲洗,因为案件已经在条令的监督下,它会再次尝试在删除之前进行插入。
class CaseType /*...*/
{
    private $doctrine;

    public function __construct($doctrine)
    {
        $this->doctrine = $doctrine;
    }
}
$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
     $data = $event->getData();
     $em  = $this->doctrine->getEntityManager();

     foreach ($data['floor'] as $floor) {
         // delete floors here...
         $duplicateFloor = $em->find('YourBundle:Floor', $floor->getId);
         $em->remove($duplicateFloor);
     }
     $em->flush();
});