web-dev-qa-db-ja.com

エンティティフィールドタイプのカスタムクエリ

次のようなエンティティタイプでフォームを作成します。

$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 "、"配列 "の期待される引数").。

9
repincln

最も簡単な方法は、クエリでgroupbyを追加することです。

$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();
13
Sergi

ここではストレートDQLを使用できないと思います。 QueryBuilderオブジェクトを使用しているため、QueryBuilderAPIを使用してクエリを作成する必要があります。

詳細はこちら:

http://www.doctrine-project.org/docs/orm/2.0/en/reference/query-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();

私はこれをチェックしていませんが、動作するはずです。お役に立てれば :)

3
Darragh Enright

リポジトリメソッドでは使用しないでください:

->getQuery()
->getResult();

一人で:

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

'query_builder' => function(EntityRepository $ er){のように

0
Igor