Symfony2 Многие поля для одного и того же свойства с отношением "многие ко многим"

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

Продукты

/**
 * @ORM\ManyToMany(targetEntity="StructureItems", inversedBy="product")
 * @ORM\JoinTable(name="product_structure_items",
 * joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="structure_item_id", referencedColumnName="id")}
 * )
 */
protected $structureItems;

StructureItems Entity

/**
 * @ORM\ManyToMany(targetEntity="Products", mappedBy="structureItems")
 */
protected $product;

Поэтому в моей форме тип, что я делаю, - это что-то вроде ниже.

Тип формы

->add('field1','entity',
 array(
 'class' => 'WidetiHarmoniaBundle:StructureItems',
 'label' => 'Tecido da Fronha',
 'empty_value' => 'Selecione o tipo de fronha',
 'query_builder' => function(EntityRepository $er) {
 return $er->createQueryBuilder('psi')
 ->where('psi.itemType = :itemType')
 ->setParameter('itemType', Enumeration::FIELD_1)
 ->orderBy('psi.itemName', 'ASC');
 },
 'mapped' => false,
 )
 )

 ->add('field2','entity',
 array(
 'class' => 'WidetiHarmoniaBundle:StructureItems',
 'label' => 'Tecido da Fronha',
 'empty_value' => 'Selecione o tipo de fronha',
 'query_builder' => function(EntityRepository $er) {
 return $er->createQueryBuilder('psi')
 ->where('psi.itemType = :itemType')
 ->setParameter('itemType', Enumeration::FIELD_2)
 ->orderBy('psi.itemName', 'ASC');
 },
 'mapped' => false,
 )
 )

В этом случае я получаю значение полей без изменений в моем контроллере и добавляю в свойство structureItems вручную. Что-то вроде...

$entity->addStructureItem($form["field1"]->getData());
$entity->addStructureItem($form["field2"]->getData());

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

Я надеюсь, что есть способ сопоставить эти поля с тем же свойством, что я мог бы помочь избежать многих ручных операций кодирования.

Любая помощь будет оценена!

1 ответ

Вы, конечно же, хотите встроить коллекцию:

$builder->add('structureItems', 'collection', array(
 'type' => new StructureItems(),
 'allow_add' => true,
));

Дополнительная информация в поваренной книге Symfony

licensed under cc by-sa 3.0 with attribution.