Ассоциация в объекте Symfony2 в поле, отличном от id, не отображается правильно в форме

В сущности в моем приложении Symfony есть ассоциация, основанная не на идентификаторах, а на серийных номерах. Ассоциация выглядит так:

/**
 * @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. Элементы, кажется, получают автоматическую нумерацию, так как значения не являются фактическими идентификаторами отдела. Они также не соответствуют серийным номерам, что является моей целью. Это пример того, что я получаю:

<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? Я знаю, что есть параметр под названием «свойство» для изменения метки каждого элемента списка, но есть ли способ изменить его значение?


person Paul Maclean    schedule 30.07.2013    source источник
comment
Что если заменить null на entity?   -  person cheesemacfly    schedule 31.07.2013
comment
Я попробовал ваше предложение. Значения элементов списка не изменяются. Они по-прежнему получают автоматические номера. Однако теперь выбрана первая опция (со значением = 0), где ранее не было выбрано ничего. (Но нет отдела с идентификатором или серийным номером 0.)   -  person Paul Maclean    schedule 31.07.2013
comment
Можете ли вы добавить код объекта Department?   -  person cheesemacfly    schedule 31.07.2013
comment
Поскольку я нашел решение, вы все еще хотите увидеть код сущности отдела? Является расширением многих других классов.   -  person Paul Maclean    schedule 01.08.2013


Ответы (1)


Я починил это; единственный способ сделать это — сделать свойство серийного номера отдела объекта идентификатором, добавив @ORM\Id к его определению.

Фактический идентификатор, который представлял собой комбинированный ключ, состоящий из двух других свойств, нигде не использовался, но использовался для устаревших целей. Теперь я определил эти поля, используя @uniqueConstraint.

В этом случае это было возможно, но очевидно, что это решение нельзя использовать, если идентификатор также связан в других местах.

Каким-то образом Symfony2 не может получить свойства без идентификатора, чтобы использовать их в качестве значений списка для сущностей, связанных с сущностью, для которой строится форма. Мне кажется баг...?

person Paul Maclean    schedule 01.08.2013
comment
У вас раньше не было @ORM\Id в вашей сущности Departement? - person cheesemacfly; 01.08.2013
comment
Я сделал, два даже. Но они были установлены не в поле серийного номера, а в двух полях, называемых id и service. Судя по всему, Symfony2 не справился с этим. Поскольку эти два поля нигде не упоминались в моем приложении Symfony2 (например, они были в базе данных, из которой были получены данные), я мог определить их как уникальную пару, а не как идентификатор. Затем я мог определить серийный номер как id, и тогда все заработало просто отлично. Тем не менее я считаю, что Symfony2 должен был справиться с этим без того, чтобы серийное поле было идентификатором, поскольку оно было правильно определено как ассоциация. - person Paul Maclean; 06.08.2013