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