web-dev-qa-db-ja.com

doctrineクエリをフェッチ結合コレクションで制限しますか?

ブログの投稿とそのコメントを返すdoctrineクエリがあります:

_SELECT b, c FROM BlogPost b LEFT JOIN b.comments c
_

結果を10件のブログ投稿に制限したいと思います。 DQLのドキュメントによると、setMaxResults()は、コレクションをフェッチして参加するクエリ(この場合はコメント)では正しく機能しません。

クエリに、結果制限メソッドを指定するフェッチ結合コレクションが含まれている場合、期待どおりに機能していません。 Set Max Resultsはデータベースの結果行の数を制限しますが、フェッチ結合されたコレクションの場合、1つのルートエンティティが多くの行に表示され、指定された結果の数よりも少なくなります。

フェッチ結合コレクションを含むdoctrineクエリを適切に制限するにはどうすればよいですか(この場合、結果を10のブログ投稿に制限します)?

28
Stephen Watkins

Paginateはdoctrine 2.2とマージされました。新しいsymfony2リリース2.0.10はと互換性があります。

今それをそのように使う

//use Doctrine paginator
use Doctrine\ORM\Tools\Pagination\Paginator;

クエリを記述して、そのような結果を呼び出します。

$query->setMaxResults($limit);
$query->setFirstResult($offset);
$results = new Paginator($query, $fetchJoin = true);

これがお役に立てば幸いです。

注:SF2 2.0.10を使用している場合は、depsファイルとdeps.lockファイルを更新し、Doctrineバンドルの2.2バージョンを指定する必要があります。

30
Rmannn

このリポジトリ http://github.com/beberlei/DoctrineExtensions には、フェッチ結合で機能するページネーション拡張機能があります。基本的に3つのSELECTステートメントを作成する必要があり、そのすべてがこの拡張機能によって実行されます。

3
beberlei