23

我想将我的实体放在查询生成器的功能中:

->add( 'weeks', 'entity', array(
    'class' => 'MV\CaravanBundle\Entity\CaravanRow',
    'property' => 'line',
    'query_builder' => function(EntityRepository $er ) use ( $caravan ) {
        return $er->createQueryBuilder('w')
                  ->orderBy('w.dateFrom', 'ASC')
                  ->where('w.caravan = ?', $caravan )
                  ->andWhere('w.visible = 1')
                  ->andWhere('w.booked = 0');
}

但得到消息:

在此上下文中不允许使用“实体\名称”类型的表达式

那么提供查询构建器信息的(最佳)方法是什么。

4

2 回答 2

43

您应该像这样单独设置参数:

->add( 'weeks', 'entity', array(
    'class' => 'MV\CaravanBundle\Entity\CaravanRow',
    'property' => 'line',
    'query_builder' => function(EntityRepository $er ) use ( $caravan ) {
        return $er->createQueryBuilder('w')
                  ->orderBy('w.dateFrom', 'ASC')
                  ->where('w.caravan = ?1')
                  ->andWhere('w.visible = 1')
                  ->andWhere('w.booked = 0')
                  ->setParameter(1, $caravan);
}

您可以使用整数或字符串,但每种语法略有不同。查看文档

于 2012-12-12T19:45:00.747 回答
15

我最近遇到了几乎同样的问题。唯一的区别是必须在“setDefaultOptions”中设置“query_builder”选项。基本上表单是这样创建的:

$builder->add('field', 'query_type', array('id' => 1));

'query_type' 类如下所示:

class QueryType extends AbstractType
{
     public function setDefaultOptions(OptionsResolverInterface $options)
     {
              $resolver->setRequired(array('id'));

              $resolver->setNormalizers(array(
                  'query_builder' => function (Options $options, $configs) {
                          return function (EntityRepository $er) use ( $options ) {
                              return $er->getSomething( $options['id'] );

                       };
                  },
              ));
     }
}

我使用 setNormalizers 函数来访问我的 $options 数组,然后我可以使用参数调用 querybuilder。

希望这对某人有用!

于 2013-09-19T11:41:18.637 回答