9

在 Symfony2 中,如果我在 Doctrine 中嵌入了一组指向多对一关系的表单并允许添加和删除,如果我从头删除一条记录,在最后添加一条,并在中间编辑一些,系统如何知道用哪些数据更新哪些记录?

本教程中没有任何内容可以传递嵌入数据的主键。在某些情况下,我的记录会被不必要地删除并再次添加,而不是在原地编辑(即使特定记录没有更改)。这会破坏未包含在表单中的记录字段,将它们设置为数据库模型中的默认值。

有没有办法在表单中传递主键并在数据返回时使用它来执行更新?

4

3 回答 3

4

如果您想为所有查询索引集合(通过实体 id),您可以简单地使用indexBy实体类中的注释。

/**
 * @ORM\OneToMany(targetEntity="EntityClass", mappedBy="EntityVariable", indexBy="id")
 */
private $collection;
于 2013-06-23T20:35:07.857 回答
1

根据Akkumulator 的回答和评论以及一些实验,我这样做了:

创建新字段(使用文档中描述的Javascript ),__name__而不是由数字而是由字符串替换:new_后跟与列表无关的永远增加的数字(例如 new_1、new_2、new_3...)

我不必将主键推送到表单中,也不需要 indexBy - 这很好,因为 indexBy 感觉它与表单相距太远,最终导致Action 在远处反模式。

为什么这样有效:

  • PHP 数组与其他语言中的数组不同。它们始终是字典,因此即使它们只有数字键开头,您也可以向它们添加字符串键。
  • 因为 Symfony 集合是按字段名称映射的,所以新字段将不匹配现有数据,删除的字段将不匹配现有数据(因此从集合中删除)
于 2016-04-06T18:41:06.970 回答
0

传递主 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 将根据输入名称绑定请求值。

于 2013-03-14T07:36:16.293 回答