Symfony形成OneToMany / ManyToOne选择器问题

时间:2015-04-30 09:54:09

标签: symfony doctrine-orm symfony-forms

我正在尝试为页面实体创建一个带有类别选择器的表单 - 页面可以在多个注册表中包含多个类别。

来自Page的关系 - > Category是OneToMany / ManyToOne,其中间PagesCategoryEntity具有discriminator属性(categoryRegistryId)。

我已成功找到了如何使用'实体'键入FormBuilder以创建一个多选框。但最后,我需要有多个选择框(对于每个注册表),在某处的html中有一个鉴别器值。

因此,我需要知道如何将PagesCategoryEntity的其他属性添加到Form中,然后如何在PageEntity的getter / setter中访问它们。

当然,我不能成为唯一一个在中间实体中拥有需​​要在表单和持久层中访问的值的人吗?

感谢您花时间看这个!

克雷格

为简洁而截断的实体和表单类。

class CategoryEntity
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    // other properties, getters, setters, etc...
}

class PageEntity
{
   /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\OneToMany(targetEntity="PagesCategoryEntity",
     *                mappedBy="page", cascade={"all"},
     *                orphanRemoval=true, indexBy="categoryRegistryId")
     */
    private $categories;

    // other properties, getters, setters, etc...
}

class PagesCategoryEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    private $id;
    /**
     * @ORM\Column(type="integer")
     */
    private $categoryRegistryId;
    /**
     * @ORM\ManyToOne(targetEntity="CategoryEntity")
     * @ORM\JoinColumn(name="categoryId", referencedColumnName="id")
     */
    private $category;
    /**
     * @ORM\ManyToOne(targetEntity="PageEntity", inversedBy="categories")
     * @ORM\JoinColumn(name="entityId", referencedColumnName="pageid")
     */
    private $page;
}

class PageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('categories', 'entity', array(
                'class' => 'MyCoolBundle:CategoryEntity',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('c')
                        ->where('c.parent = :parent')
                        ->setParameter('parent', 19)
                        ->orderBy('c.name', 'ASC');
                },
                'property' => "name",
                'multiple' => true,
                'required' => false,
                'empty_data' => null,
            ));
    }
}

2 个答案:

答案 0 :(得分:2)

然后试试这个:

         ->add('categories',
                      'entity',
                       array(
                             'class'=>'Acme\MycoolBundle\Entity\Category',
                             'property'=>'name',
                             'query_builder' => function (\Acme\MycoolBundle\Entity\CategoryRepository $repository)
                             {
                                 return $repository->createQueryBuilder('c')
                                        ->where('c.parent = :parent')
                                        ->setParameter('parent', 19)
                                        ->add('c.name', 'ASC');
                             }
                            )
                      );

尝试创建一个类别存储库,如果你没有并根据你的需要调整脚本它对我有用!

答案 1 :(得分:1)

尝试使用Collection而不是使用Entity!

集合用于一对多/多对一

你可以尝试使用symfony cookbook的教程来收集表格 http://symfony.com/doc/current/cookbook/form/form_collections.html

我希望它有所帮助;)