实体字段类型自定义查询参数

时间:2012-01-27 13:37:04

标签: php symfony doctrine

我想在Symfony 2中构建一个Entity字段类型,并将参数传递给查询构建器以获取相关对象的过滤器列表:

$formMapper
            ->add('article_subcategories', 'entity',
                    array(
                         'label' => 'Podkategorie',
                         'multiple' => true,
                         'expanded' => true,
                         'read_only' => true,
                         'class' => 'FachowoArticleBundle:ArticleSubcategory',
                         'query_builder' => function (EntityRepository $er)
                         {
                             return $er
                                     ->createQueryBuilder('sc')
                                      ->where('sc.article_category = :id')
                                      ->orderBy('sc.name', 'ASC')
                                      ->setParameter('id', $id);
                         }
                    ));

如何在formMapper中将$ id传递给此函数?

2 个答案:

答案 0 :(得分:8)

您可以使用PHP 5.3的闭包。大多数带闭包的语言会自动执行此操作,但PHP要求您明确指定列表。

'query_builder' => function (EntityRepository $er) use ($id)
   {
      return $er
        ->createQueryBuilder('sc')
        ->where('sc.article_category = :id')
        ->orderBy('sc.name', 'ASC')
        ->setParameter('id', $id);
    }

答案 1 :(得分:1)

一种很好的方法是在创建表单时使用options数组,因此在数组中传递id,然后在表单中执行:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $id = $options['id'];
    $builder
        ->add('foo', 'entity', array(
            'class' => 'Foo',
            'query_builder' => function (EntityRepository $er) use ($id) {
                return $er->findByBar($id);
            }
        ))
    ;
}