web-dev-qa-db-ja.com

doctrine querybuilderの制限とオフセット

私はsymfonyの初心者で、フレームワークでブログを作りたいです。この方法でリポジトリを使用してホーム記事を取得します:

public function getHomeArticles($offset = null, $limit = null)
{
    $qb = $this->createQueryBuilder('a')
               ->leftJoin('a.comments', 'c')
               ->addSelect('c')
               ->addOrderBy('a.created', 'DESC');


    if (false === is_null($offset))
        $qb->setFirstResult($offset);

    if (false === is_null($limit))
        $qb->setMaxResults($limit);

    return $qb->getQuery()
              ->getResult();
}

私のデータベースには10の記事があります。私のBlogControllerでは次を使用します。

$blog = $em->getRepository('TestBlogBundle:Article')
                ->getHomeArticles(3,4);

これで4つの記事が欲しい。しかし、見返りに私はまた1つの記事を持っています。

何が問題ですか?

18
Astram56

これは 問題の認識 です。クエリにフェッチ結合コレクションが含まれる場合、setFirstResult()およびsetMaxResults()を注意して使用する必要があります。

最初と最大の結果項目

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

代わりに、次のことができます。

  1. 遅延負荷

  2. Paginator を使用します(ここで@Marcoが述べたように)

  3. Doctrine\Common\Collections\Collection::slice() を使用します

29
Mick