web-dev-qa-db-ja.com

symfonyフォームquery_buiderとエンティティリポジトリ

ログに記録されているユーザーに応じて、コレクションタイプのデータを含むフォームを作成しようとしています。私は Symfonyクックブックのこの章 に従っています。

query_builderオプションは、DQLからデータを取得するためのクロージャーです。データはコードの別の場所からフェッチする必要があるため、Repositoryクラスでクエリを定義することをお勧めします。

これが私のリポジトリの関数です:

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

この関数は、コントローラーで呼び出されたときに機能し、Articleの配列を返します。以下は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!)
                    },
                );

Query_builderで自分のリポジトリ関数を呼び出すと、エラーが発生します:Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given、これは私のリポジトリがQueryBuilderではなくEntityの配列を返すため理解できます。

コードを複製してフォームに新しいQueryBuilderを作成したくありません。リポジトリからのクエリを使用するためのベストプラクティスは何ですか?私はリポジトリに2つの関数を持ち、1つは配列を返し、もう1つはQueryBuilderを返すことを考えていましたが、Symfonyドキュメントのコメントまたはリポジトリのメソッドを呼び出します(さらに良いです!) "このケースにはもっと良い方法があると思います。

15
Florent

簡単なはずです。以下をせよ:

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を返します

28
saamorim

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();
}
8
unagi