Symfony CollectionType 更新实体

Symfony CollectionType update Entities

我不敢相信这还没有出现在其他人身上,但我找不到解决方案。

假设我有两个实体类型,A 和 B,具有一对多关系。 A 有 B 的集合。

A 的表单有 B 的 CollectionType,B 的自定义 entry_typeallow_addallow_delete 设置为 true。当表单为 created/populated/rendered 时,B 的字段由它们在集合中的索引标识。回传表单时,字段会根据索引重新映射回B实体

如果数据库同时决定 return B 的顺序不同怎么办?然后在 Bs 上交换值!我不能那样做,因为其他实体会引用 B,现在它们已经改变了它们的含义!

即使数据库没有改变顺序,当删除 B 时也会出现同样的问题:字段在 B 中移动并删除了一个不同的字段! (好吧,我不是 100% 肯定会发生这种情况,因为发布字段的编号存在差距。)我发现了这个类似的问题,它在创建另一个问题时确实发生了(Symfony CollectionType regards deletion+creation as a modification of an item ),但问题有点偏离,没有可用的答案。

如何确保表单正在更新用户实际编辑的实体?

我已经尝试将 B 的 ID 呈现为 HiddenType,但随后表单合理地抱怨 ID 没有 setter。无论如何,它可能会在错误的 B 上强制使用 ID,而 Doctrine 不喜欢这样。我想我可以将 Bs 添加为未映射并手动将值复制到正确的对象,但这会破坏 Symfony 表单系统的很大一部分。

我以前使用过 CollectionType,但不用于其他地方引用的实体。然后我会删除所有以前的实体并根据发布的数据重新创建集合。但我现在不能那样做,可以吗?

自学说 2.1 起,可以更改 how associations are indexed。这将允许您使用 id 作为集合键(因为该字段必须是唯一的):

@OneToMany(targetEntity="B", mappedBy="A", indexBy="id")

您可能还需要启用 orphanRemoval 以便实际删除数据,而不是将关系设置为 null