Symfony2 实体中除 id 以外的字段的关联在表单中未正确显示

Posted

技术标签:

【中文标题】Symfony2 实体中除 id 以外的字段的关联在表单中未正确显示【英文标题】:Association in Symfony2 entity on field other than id does not display correctly in form 【发布时间】:2013-07-30 14:37:09 【问题描述】:

在我的 Symfony 应用程序中的一个实体中,有一个关联不是基于 id,而是基于序列号。关联如下所示:

/**
 * @var Department
 *
 * @ORM\ManyToOne(targetEntity="Department")
 * @ORM\JoinColumn(name="department_serial", referencedColumnName="serial")
 */
protected $department;

当我为这个实体创建一个表单时,我像这样添加字段部门:

->add('department', null, array
(
  'label' => 'Choose department',
  'required' => true,
  //some more...
))

问题在于,当呈现表单时,我最终会得到错误的 html 列表项值。这些项目似乎得到了自动编号,因为这些值不是实际的部门 ID。它们也不对应于序列号,这是我的目标。这是我得到的一个例子:

<select id="someId" name="form[someName]">
  <option value="0">Department A</option>
  <option value="1">Department B</option>
  <option value="2">Department C</option>
  <option value="3">Department D</option>
  <option value="4">Department E</option>
  <option value="5">Department F</option>
</select>

上面列表项的值,应该是每个部门的序号。由于它们不是,实体与其部门之间的链接似乎丢失了,并且无法保存我的表单。 (需要选择一个部门,并且这些序列号 [0, 1, 2, 3, 4, 5] 的部门不存在。)

因此,我的问题是:如何在表单类型中指明关联实体的哪个属性应该用作 html 列表中的值?我知道有一个名为“property”的选项可以更改每个列表项的标签,但是有没有办法更改其值?

【问题讨论】:

如果将null 替换为entity 会怎样? 我尝试了你的建议。列表项的值没有变化。他们仍然会收到自动号码。但是,现在选择了第一个选项(value="0"),而之前没有选择。 (但没有id或序列号为0的部门。) 可以添加Department实体码吗? 我找到了解决方案,您还想查看部门实体代码吗?它是许多其他类的扩展。 【参考方案1】:

我修好了;这样做的唯一方法是通过将@ORM\Id 添加到实体Department 的定义中来使实体Department 的序列属性成为id。

实际的 id 是由其他两个属性组成的组合键,没有在任何地方使用,而是用于遗留目的。我现在使用@uniqueConstraint 定义了这些字段。

在这种情况下这是可能的,但如果 id 也链接到其他地方,则显然无法使用此解决方案。

不知何故,Symfony2 无法访问非 id 属性以用作与正在为其构建表单的实体相关的实体的列表值。对我来说似乎是一个错误......?

【讨论】:

您之前的@​​987654322@ 实体中没有任何@ORM\Id 我做到了,甚至两个。但它们不是设置在序列字段上,而是设置在 id 和 service 两个字段上。显然,Symfony2 无法处理这个问题。由于这两个字段在我的 Symfony2 应用程序的任何地方都没有被引用(就像它们在数据来自的数据库中一样),我可以将它们定义为一个唯一的对而不是一个 id。接下来,我可以将序列定义为 id,然后一切正常。我仍然相信 Symfony2 应该能够在没有序列字段作为 id 的情况下处理这个问题,因为它被正确定义为关联。

以上是关于Symfony2 实体中除 id 以外的字段的关联在表单中未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:字段或鉴别器列映射中实体上列“id”的重复定义

学说 Symfony2 坚持与现有的关联实体

使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段

Symfony2:获取持久化对象的 id

在 Symfony2 中检测实体配置错误

Symfony2 生成带有选项的实体字段