Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

symfony2 form querybuilder with parameters

I want to put my entity in the function of the query builder:

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

but get the message:

Expression of type 'Entity\Name' not allowed in this context

So what is the (best) way to give the querybuilder information.

like image 720
Mitchel Verschoof Avatar asked Dec 12 '12 19:12

Mitchel Verschoof


2 Answers

You should set the parameter separately like so:

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

You can either use an integer or string, but the syntax is slightly different for each. See the docs

like image 91
Squazic Avatar answered Oct 17 '22 18:10

Squazic


I recently ran across almost the same problem. Only difference was the 'query_builder' option has to be set inside 'setDefaultOptions'. Basicly the form is created like this:

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

The 'query_type' class looks like this:

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

                       };
                  },
              ));
     }
}

I use the setNormalizers function to access my $options array and from there on i can call the querybuilder with parameters.

Hope this is useful for someone!

like image 20
Sam Avatar answered Oct 17 '22 17:10

Sam