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 以外的字段的关联在表单中未正确显示的主要内容,如果未能解决你的问题,请参考以下文章