28

私は 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つの記事を持っています。

何が問題ですか?

4

1 に答える 1

43

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

最初と最大の結果項目について述べたように:

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

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

  1. 遅延読み込み

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

  3. 使用するDoctrine\Common\Collections\Collection::slice()

于 2013-02-15T01:04:06.517 に答える