Symfony form query_buider и репозиторий объектов
Я пытаюсь создать форму с данными в типе коллекции в зависимости от пользователя, который регистрируется. Я следую этой главе кулинарной книги Symfony.
Все отлично работает, когда опция query_builder
является закрытием, где я получаю свои данные из DQL. Поскольку данные нужно извлекать из разных мест в коде, я бы предпочел определить запрос в классе репозитория.
Вот функция в моем репозитории:
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();
}
Эта функция работает при вызове в контроллере и возвращает массив статьи. Вот фрагмент документа symfony:
$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!)
},
);
Когда я отправляю вызов функции Repository в query_builder, я получаю сообщение об ошибке: Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given
, что я могу понять, потому что мой репозиторий возвращает массив Entity, а не QueryBuilder.
Я не хочу дублировать код и создавать новый QueryBuilder в форме. Какова наилучшая практика использования запроса из репозитория? Я думал о наличии двух функций в репозитории, один возвращал массив, а другой возвращал QueryBuilder, но комментарий в документе Symfony doc или вызывал метод в вашем репозитории (даже лучше!) "Позвольте мне подумать, что лучший способ для этого случай.
Ответы
Ответ 1
Это должно быть легко. Выполните следующие действия:
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();
}
Затем в построителе формы:
$formOptions = array(
'class' => 'Acme\DemoBundle\Entity\User',
'multiple' => false,
'expanded' => false,
'property' => 'fullName',
'query_builder' => function(EntityRepository $er) use ($user) {
return $er->queryOwnedBy($user);
},
);
ИЗМЕНИТЬ
Спасибо за ncatnow и unagi. Я изменил предыдущие функции, чтобы вернуть querybuilder
Ответ 2
Я просто немного исправился с saamorim. Рабочий код будет примерно таким:
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();
}