web-dev-qa-db-fra.com

constructeur de requêtes de formulaire symfony2 avec paramètres

Je veux mettre mon entité dans la fonction du générateur de requêtes:

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

mais obtenez le message:

Expression de type "Entité\Nom" non autorisée dans ce contexte

Alors, quelle est la (meilleure) façon de donner des informations au constructeur de requêtes.

23
Mitchel Verschoof

Vous devez définir le paramètre séparément comme suit:

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

Vous pouvez soit utiliser un entier ou une chaîne, mais la syntaxe est légèrement différente pour chacun. Voir les documents

39
Squazic

J'ai récemment rencontré presque le même problème. Seule différence, l'option 'query_builder' doit être définie dans 'setDefaultOptions'. Fondamentalement, le formulaire est créé comme ceci:

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

La classe 'query_type' ressemble à ceci:

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

                       };
                  },
              ));
     }
}

J'utilise la fonction setNormalizers pour accéder à mon tableau $ options et à partir de là, je peux appeler le constructeur de requêtes avec des paramètres.

J'espère que cela est utile pour quelqu'un!

15
Sam