我正在从一个实体创建一个表单,我有一些属性,其中一个具有多对多关系,我需要创建多个字段才能使用。
产品实体
/**
* @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实体
/**
* @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());
问题在于我不知道这是否是正确的方法,或者是否有更好的解决方案。如果不是最好的解决方案,花更多的时间也许不是一件好事。
我希望有一种方法可以将这些字段映射到同一个属性,这有助于避免大量的手动编码工作。
任何帮助都将不胜感激!!
答案 0 :(得分:0)
你当然想要嵌入一个集合:
$builder->add('structureItems', 'collection', array(
'type' => new StructureItems(),
'allow_add' => true,
));
中的更多信息