Symfony formularz zapytania buider i repozytorium encji

Próbuję utworzyć formularz z danymi w typie kolekcji w zależności od zalogowanego użytkownika. Podążam za tym rozdziałem Symfony cookbook .

Wszystko działa dobrze, gdy opcja query_builder jest zamknięciem, z którego pobieram dane z DQL. Ponieważ dane muszą być pobierane z innej lokalizacji w kodzie, wolałbym zdefiniować zapytanie w klasie repozytorium.

Oto funkcja w moim repozytorium:

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

Ta funkcja działa, gdy jest wywoływana w Kontrolera i zwraca tablicę artykułów. Oto fragment symfony doc:

$formOptions = array(
                    'class' => 'Acme\DemoBundle\Entity\User',
                    '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!)
                    },
                );

Kiedy wywołuję funkcję repozytorium w query_builder, pojawia się błąd : Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given, który mogę zrozumieć, ponieważ moje repozytorium zwraca tablicę encji, a nie Querybuilder.

Nie chcę powielać kodu i tworzyć nowego Querybuildera w formularzu. Jaka jest najlepsza praktyka korzystania z zapytania z repozytorium ? Myślałem o dwóch funkcjach w repozytorium, jednej zwracając tablicę, a drugi zwracając QueryBuilder, ale komentarz w Symfony doc " lub wywołanie metody w repozytorium (jeszcze lepiej!) " niech pomyślę, że jest lepszy sposób na tę sprawę.

Author: kiedis, 2013-07-16

2 answers

To powinno być łatwe. Wykonaj następujące czynności:

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

Następnie w kreatorze formularzy:

$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

Dziękuję za ncatnow i unagi zmieniłem poprzednie funkcje, aby zwrócić querybuilder

 24
Author: saamorim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 10:30:48

Właśnie poprawiłem odpowiedź saamorim. Kod roboczy byłby podobny do tego:

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
Author: unagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 21:57:50