Symfony2许多字段属于同一属性,具有多对多关系

时间:2014-07-01 14:08:29

标签: symfony

我正在从一个实体创建一个表单,我有一些属性,其中一个具有多对多关系,我需要创建多个字段才能使用。

产品实体

/**
 * @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());

问题在于我不知道这是否是正确的方法,或者是否有更好的解决方案。如果不是最好的解决方案,花更多的时间也许不是一件好事。

我希望有一种方法可以将这些字段映射到同一个属性,这有助于避免大量的手动编码工作。

任何帮助都将不胜感激!!

1 个答案:

答案 0 :(得分:0)

你当然想要嵌入一个集合:

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

Symfony cookbook

中的更多信息