2012-01-13 11 views
1

DBから返されるアソシエーションの数を制限できますか?たとえば、次のようなエンティティを持っているとします:Doctrine2 - 返される関連エンティティの数を制限する

/** @Entity */ 
Article { 
    /** @OneToMany(targetEntity="Comments") */ 
    private $comments; 
    ... 
} 

/** @Entity */ 
Comments { ... } 

そして、記事のコレクションを繰り返してみると、最近のコメントは5つしかありません。 (合計で100以上ある可能性があります)。私は、QueryBuilderを使用してカスタムリポジトリからコレクションを取得します。

$articles = $em->getRepository("Article")->findArticles($commentLimit, ...); 
foreach($articles as $article) { 
    foreach($article->getComments() as $comment) { 
     //loop will iterate just $commentLimit times 
     echo $comment->getText(); 
    } 
} 

それはACシングルクエリ内でこれを行うことは可能です:実際には

私はこのようなものを使用しますか?

答えて

2

この特定のケースでは、私は彼らの最終更新日時によって、この場合に

/** @Entity */ 
Article { 
    /** 
    * @OneToMany(targetEntity="Comments", fetch="EXTRA_LAZY") 
    * @OrderBy({"lastModified" = "DESC"}) 
    */ 
    private $comments; 
} 

@OrderByjust sorts the fetched elements by one or more attributesを使用します。 EXTRA_LAZYをコレクションに使用すると、メソッドの一部がコレクション全体を初期化せず、その一部のみを初期化するため、動作が変更されます。 それはあなたがちょうど最初の要素をロードするためにあなたの例では使用することができDoctrine\ORM\PersistentCollection#slice($start, $end)の場合、次のとおりです。

$articles = $em->getRepository("Article")->findArticles(...); 
foreach($articles as $article) { 
    foreach($article->getComments()->slice(0, $commentLimit) as $comment) { 
     echo $comment->getText(); 
    } 
} 

あなたは関係なく、記事の最後の5件のコメントを取得されて何をしたいのか、そして、あなたが使用する必要がある場合DQL

+0

問題は、コードが各記事に対して1つのクエリを生成することです。 ( 'fetch =" EXTRA_LAZY "'のため)私は1つまたは2つのクエリですべてをフェッチしたいと思います。 –

関連する問題