我有一个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,还是以任何其他方式解决此问题?
答案 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