0

在我的 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”的选项可以更改每个列表项的标签,但是有没有办法更改它的值?

4

1 回答 1

0

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

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

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

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

于 2013-08-01T09:59:56.633 回答