32

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

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c

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

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

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

4

4 に答える 4

35

Paginateはdoctrine2.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バージョンを指定する必要があります。

于 2012-02-23T17:02:44.157 に答える
3

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

于 2011-04-12T16:40:33.587 に答える
-1

これは古いものですが、これはGoogleで高得点を獲得し、教義の左参加制限を探しています。すぐに「教義のページング」を探しましたが、それが私が探していたものであるとグーグルに主張した後(教義のページネーションではありません)、それを使用する方法を理解するのにまだ問題がありました。

間違って検索したかもしれませんが、paginatorオブジェクトに関する適切なドキュメントを実際に見つけることができませんでした。ともかく; 結果を得るために私はgetIteratorを使用しましたが、それはうまくいきました。

私のコードには、rssリンクを含むソースとrssフィードからの記事であるArticlesがあります。したがって、この例では、1つのソースとすべての記事を取得します。このコードはSymfonyからのものです。

        // get the articles (latest first) from source 743
        $q=$this->getDoctrine()->getManager()
          ->createQuery('select s, a from MyCompanyRssBundle:Source s 
          join s.Articles a 
          where s.id = :id 
          order by a.id desc')
          ->setParameter('id',743);
        $q->setMaxResults(1);  // this limits Articles to be only 1
                               // when using $q->getResult();
        $sources=new Paginator($q, $fetchJoin = true);
        $sources=$sources->getIterator();
        var_dump($sources[0]->getArticles());
于 2013-05-31T11:35:23.803 に答える
-2

クエリビルダーで同じことをしました、そしてそれは働きます。多分何か他のものが問題ですか?

$qb->add('select', 'b, c, ch, g')
   ->add('from', 'Broadcast b')
   ->add('groupBy', 'b.title')
   ->add('where', 'b.imageBig != \'\'')
   ->add('orderBy', 'b.starttime ASC')
   ->setMaxResults(10)
   ->leftJoin('b.category', 'c')
   ->leftJoin('b.channel', 'ch')
   ->leftJoin('b.genre', 'g')
于 2011-04-12T15:10:52.263 に答える