首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除插入前的原则刷新

删除插入前的原则刷新
EN

Stack Overflow用户
提问于 2014-03-07 12:49:00
回答 1查看 2.5K关注 0票数 7

我有一个可以有多层(OneToMany)的案例实体,每一层都有一个指定其类型的FloorType。我的楼层实体中也有一个UniqueConstraint,它不允许在每个情况下使用同一FloorType的两层。

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

Symfony的form集合文档说,如果没有提交项,它将自动从DB中删除。

现在的问题是,如果我在DB中已经有一个实例的地板,当我以我的形式删除地板并再次添加它时,它将被认为是一个新的插入,但是由于Doctrine首先执行插入并删除最后一个插入来执行刷新,我将得到以下违反我设置的uniqueConstraint的错误:

SQLSTATE23000:完整性约束违反:键'floors_case_floor_type_unique‘的1062重复条目'4-2’

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

是否有任何办法使删除前插入原则,或任何其他方式解决这一问题?

EN

回答 1

Stack Overflow用户

发布于 2014-03-07 13:15:31

实现这一目标的一种方法是一个FormEvent

我建议你将您的FormType注册为服务,这样你就可以注射理论了

代码语言:javascript
复制
# 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

代码语言:javascript
复制
class CaseType /*...*/
{
    private $doctrine;

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

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

代码语言:javascript
复制
$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();
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22250540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档