Symfony2表单查询构建器与参数

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');
}

但是收到了以下信息:

在此上下文中,不允许使用类型为'Entity\Name'的表达式

那么给查询构建器提供信息的(最佳)方式是什么?

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);
}

你可以使用整数或字符串,但每种类型的语法略有不同。请参阅文档


1
你的链接已失效! - Jean-Luc Barat
我可以传递EnityManger查询而不是QueryBuilder吗?它能正常工作吗? - Snopzer

15

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

$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数组,从那里我可以使用参数调用查询构建器。

希望这对某人有用!


当您定义默认选项时,如果您的匿名函数需要选项,则这是一个很好的解决方案。 - Aistis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接