Symfony form query_buider и репозиторий объектов - программирование

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 или вызывал метод в вашем репозитории (даже лучше!) "Позвольте мне подумать, что лучший способ для этого случай.

4b9b3361

Ответ 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();
}