Formulaire de Symfony query builder et entité référentiel

j'essaie de créer un formulaire avec des données dans le type de collecte en fonction de l'utilisateur étant connecté. Je suis la suite ce chapitre du livre de recettes Symfony.

Tout fonctionne très bien lorsque l' query_builder option est une fermeture où je reçois mes données de la DQL. Comme les données doivent être récupérées à partir d'un emplacement différent dans le code, je préférerais définir la requête dans la classe de dépôt.

Voici la fonction de mon dépôt:

public function findOwnedBy($user) {
    $query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId");
    $query->setParameters(array("userId"=>$user->getId()));
    return $query->getResult();
}

ce la fonction fonctionne lorsqu'elle est appelée dans un Controller et renvoie un tableau D'Article. Voici un extrait de la doc de symfony :

$formOptions = array(
                    'class' => 'AcmeDemoBundleEntityUser',
                    'multiple' => false,
                    'expanded' => false,
                    'property' => 'fullName',
                    'query_builder' => function(EntityRepository $er) use ($user) {
                        // build a custom query, or call a method on your repository (even better!)
                    },
                );

Quand je mets un appel à ma fonction de dépositaire dans le query_builder, j'obtiens une erreur : Expected argument of type "DoctrineORMQueryBuilder", "array" given, ce que je peux comprendre parce que mon dépôt renvoie un tableau D'Entity, pas un QueryBuilder.

Je ne veux pas dupliquer le code et créer un nouveau QueryBuilder dans la forme. Quelle est la meilleure pratique pour utiliser la requête du dépôt ? Je pensais d'avoir deux fonctions dans le dépôt, l'une retournant un tableau et l'autre retournant le QueryBuilder, mais le commentaire dans Symfony doc "ou appeler une méthode sur votre dépôt (encore mieux!) " laissez-moi penser qu'il y a une meilleure façon pour cette affaire.

13
demandé sur kiedis 2013-07-16 16:39:50

2 réponses

ça devrait être facile. Procédez de la manière suivante:

public function queryOwnedBy($user) {

    $query = $this->createQueryBuilder('a')
            ->from('MyBundle:Article', 'a')
            ->innerJoin('a.owndBy', 'u')
            ->where('u.id = :id')                
            ->setParameter('id', $user->getId());

    return $query;
}

public function findOwnedBy($user) {
    return $this->queryOwnedBy($user)
            ->getQuery()
            ->getResult();
}

Puis dans le générateur de formulaire:

$formOptions = array(
    'class' => 'Acme\DemoBundle\Entity\User',
    'multiple' => false,
    'expanded' => false,
    'property' => 'fullName',
    'query_builder' => function(EntityRepository $er) use ($user) {
        return $er->queryOwnedBy($user);
    },
);

EDIT

Merci pour ncatnow et unagi, j'ai changé les fonctions précédentes pour retourner le querybuilder

24
répondu saamorim 2014-07-14 10:30:48

je viens de faire une petite correction de saamorim réponse. Le code de travail serait quelque chose comme ceci:

public function queryOwnedBy($user) {

    $query = $this->createQueryBuilder("u")
            ->where('u.id = :id')                
            ->setParameter('id', $user->getId());

    return $query;
}

public function findOwnedBy($user) {
    return $this->queryOwnedBy($user)
            ->getQuery()
            ->getResult();
}
8
répondu unagi 2014-01-22 21:57:50