在 Symfony2 中,如果我在 Doctrine 中嵌入了一组指向多对一关系的表单并允许添加和删除,如果我从头删除一条记录,在最后添加一条,并在中间编辑一些,系统如何知道用哪些数据更新哪些记录?
本教程中没有任何内容可以传递嵌入数据的主键。在某些情况下,我的记录会被不必要地删除并再次添加,而不是在原地编辑(即使特定记录没有更改)。这会破坏未包含在表单中的记录字段,将它们设置为数据库模型中的默认值。
有没有办法在表单中传递主键并在数据返回时使用它来执行更新?
在 Symfony2 中,如果我在 Doctrine 中嵌入了一组指向多对一关系的表单并允许添加和删除,如果我从头删除一条记录,在最后添加一条,并在中间编辑一些,系统如何知道用哪些数据更新哪些记录?
本教程中没有任何内容可以传递嵌入数据的主键。在某些情况下,我的记录会被不必要地删除并再次添加,而不是在原地编辑(即使特定记录没有更改)。这会破坏未包含在表单中的记录字段,将它们设置为数据库模型中的默认值。
有没有办法在表单中传递主键并在数据返回时使用它来执行更新?
如果您想为所有查询索引集合(通过实体 id),您可以简单地使用indexBy
实体类中的注释。
/**
* @ORM\OneToMany(targetEntity="EntityClass", mappedBy="EntityVariable", indexBy="id")
*/
private $collection;
根据Akkumulator 的回答和评论以及一些实验,我这样做了:
创建新字段(使用文档中描述的Javascript ),__name__
而不是由数字而是由字符串替换:new_后跟与列表无关的永远增加的数字(例如 new_1、new_2、new_3...)
我不必将主键推送到表单中,也不需要 indexBy - 这很好,因为 indexBy 感觉它与表单相距太远,最终导致Action 在远处反模式。
为什么这样有效:
传递主 id 的一种方法是使用INDEX BY。
例如,假设我有一个名为 Customer 的实体,而一个 Customer 有几封电子邮件。在我的客户存储库类中,我可以指定要按电子邮件的主 ID 索引的集合。
$qb->select('c, e')
->leftJoin('c.emails', 'e', null, null, 'e.id')
->where('c.id = :id');
通过这样做,输入标签的生成名称将是
customer[emails][e.id][fieldName]
提交表单后,Symfony 将根据输入名称绑定请求值。