Symfony 2中的ArrayCollection(表单集合)索引冲突

use*_*259 18 javascript php forms collections symfony

我正在使用Symfony2来构建我的页面.当我尝试更新表单集合时(如cookbook条目" 如何嵌入表单集合 "中所述),我得到前端的索引和后端的ArrayCollection索引的冲突.

我有关系用户< - >地址(OneToMany).用户想要创建/更新/删除他的地址,因此他可以在javascript部分新地址元素的帮助下在前端添加/删除.他做了以下事情:

(1)添加新地址(索引:0)

(2)添加新地址(索引:1)并立即再次删除该地址

(3)添加新地址(索引:2).

当他点击"保存"按钮时,以下代码保存/更新用户(及其地址):

 $this->em->persist($user);
 $this->em->flush();
Run Code Online (Sandbox Code Playgroud)

例如,新地址可以正确地保存到数据库中.现在用户想要更新地址,例如索引0.当他现在点击保存按钮时,它用"索引0"更新地址,但同时,它再次添​​加带有"索引2"的地址到数据库(对象).为了更好地理解这个问题,我画了一个小插图(手工制作,对我糟糕的艺术技巧感到抱歉):

收集错误图像 现在,我的对象/数据库中的"索引1"的地址是两倍.我知道为什么会发生这种情况,这是因为第一个"索引1"地址被映射到ArrayCollection元素"number 1",第二个被映射到"number 2"(因为前端名称"index 2").你可以说:"它只是填满了地址,直到它到达后端的前端索引".但是我该如何解决这个问题呢?

站点说明:使用ajax请求会发生此行为,因为如果您在单击"保存按钮"后重新加载页面,它将使用后端中的索引正确地重新索引前端中的地址.

我建议处理这种情况:

单击使用服务器端索引保存后重新索引前端索引.这是我的问题的明确/唯一解决方案吗?

kba*_*kba 7

是的,这是Symfony表单集合的问题,它没有简单的解决方案imho.但是我不得不问你为什么不对页面刷新做同样的事情呢?您只能刷新带有集合的html代码段.代码段的HTML代码可以来自服务器端.回到你的问题 - 是的,重新索引是一个很好的解决方案,直到你不想尝试自己编写自定义集合类型.

symfony中/ symfony中/问题/ 7828

在集合中验证存在类似的问题 - symfony/symfony/issues/7468.

我认为默认集合类型和Symfony文档中的教程有一些缺点.希望有所帮助.