Подтвердить что ты не робот

Symfony2 form querybuilder с параметрами

Я хочу, чтобы моя сущность была в функции построителя запросов:

->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' не разрешено в этом контексте

Итак, каков (лучший) способ предоставить информацию querybuilder.

4b9b3361

Ответ 1

Вы должны установить параметр отдельно следующим образом:

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

Вы можете использовать целое число или строку, но синтаксис немного отличается для каждого. См. документы

Ответ 2

Недавно я столкнулся с почти той же проблемой. Единственным отличием был параметр "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 и оттуда я могу вызвать querybuilder с параметрами.

Надеюсь, это полезно для кого-то!