我有一个可以有多层(OneToMany)的案例实体,每一层都有一个指定其类型的FloorType。我的楼层实体中也有一个UniqueConstraint,它不允许在每个情况下使用同一FloorType的两层。
为了在每个案例中插入楼层,我为地板创建了一个Symfony集合类型,并使用js为我的案例添加了新的楼层。
Symfony的form集合文档说,如果没有提交项,它将自动从DB中删除。
现在的问题是,如果我在DB中已经有一个实例的地板,当我以我的形式删除地板并再次添加它时,它将被认为是一个新的插入,但是由于Doctrine首先执行插入并删除最后一个插入来执行刷新,我将得到以下违反我设置的uniqueConstraint的错误:
SQLSTATE23000:完整性约束违反:键'floors_case_floor_type_unique‘的1062重复条目'4-2’
这意味着Doctrine在尝试从同一个表中删除最后一行之前,尝试将一行插入到与已删除的表相同的FloorType中。
是否有任何办法使删除前插入原则,或任何其他方式解决这一问题?
发布于 2014-03-07 13:15:31
实现这一目标的一种方法是一个FormEvent。
我建议你将您的FormType注册为服务,这样你就可以注射理论了
# 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;
}
}现在在您的EventListener的buildForm方法中注册一个CaseType
$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();
});https://stackoverflow.com/questions/22250540
复制相似问题