пользовательский запрос в типе поля сущности - PullRequest
9 голосов
/ 10 декабря 2011

Я создаю форму с типом сущности следующим образом:

$form = $this->createFormBuilder()
->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('u')
                          ->orderBy('u.name', 'ASC');
                        },)
      )
->getForm();

Теперь я хочу изменить эту форму, чтобы показывать только отдельных пользователей.Я пытаюсь это:

->add('users', 'entity', array(
                        'class' => 'UserBundle:Users',
                        'query_builder' => function(EntityRepository $er) {
                        return $er->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users ORDER BY u.name ASC')->getResult();
                        },)
                      )

, но Symfony выдает мне исключение.У меня вопрос, как я могу использовать пользовательский запрос в типе поля сущности?


Я не понимаю, что вы имеете в виду под последним ответом.Мой код выглядит так:

хранилище:

public function getDistinctUsers()
{
    return $this->getEntityManager()->createQuery('SELECT DISTINCT u.name FROM UserBundle:Users u ORDER BY u.name DESC')->getResult();
}

контроллер:

->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
    'query_builder' => function(EntityRepository $er) {
            return $er->getDistinctUsers();
         },)
      )

веточка:

<form action="{{ path('user') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <input type="submit" />
</form>

и выдает исключение:Во время рендеринга шаблона было сгенерировано исключение («Ожидаемый аргумент типа« Doctrine \ ORM \ QueryBuilder »,« массив »задан») ...

Ответы [ 3 ]

13 голосов
/ 12 января 2012

Самый простой способ - добавить группу в запросе:

$form = $this->createFormBuilder()
  ->add('users', 'entity', array(
    'class' => 'UserBundle:Users',
    'query_builder' => function(EntityRepository $er) {
      return $er->createQueryBuilder('u')
                ->groupBy('u.id')
                ->orderBy('u.name', 'ASC');
      },)
    )
->getForm();
3 голосов
/ 10 декабря 2011

Я не думаю, что вы можете использовать прямой DQL здесь; вы используете объект QueryBuilder, поэтому вам нужно использовать API QueryBuilder для построения вашего запроса.

Больше информации здесь:

http://www.doctrine -project.org / документы / ОРМ / 2.0 / ен / ссылка / запрос-builder.html

Редактировать

В качестве альтернативы вы можете группировать по имени?

return $er->createQueryBuilder('u')
    ->groupBy('u.name')
    ->orderBy('u.name');

Редактировать

Хорошо ... Если вам абсолютно необходимо использовать DQL, есть другой способ. Вы создаете собственный репозиторий для вашей сущности, и в этом определяете метод с вашим пользовательским запросом. Документация Symfony охватывает этот процесс здесь:

http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes

Предположим, вы создали метод с именем findDistinctUsers. Тогда это просто случай изменения кода в вашей форме:

return $er->findDistinctUsers();

Я не проверял это, но оно должно работать. Надеюсь, это поможет:)

0 голосов
/ 06 июня 2018

Не использовать в методе репозитория:

->getQuery()
->getResult();

только один:

->createQueryBuilder('u')
->groupBy('u.name')
->orderBy('u.name');

как в 'query_builder' => function (EntityRepository $ er) {

...