2012-12-24 42 views
3

我有兩個實體Question和Tag。它們之間有很多關係,並且有一個生成的'tag_question'表(帶有question_id和tag_id列)。限制Symfony2中的多對多關係結果

$questions = $tag->getQuestion(); 

當這個被執行時,它返回所有的結果,所有的問題與標籤。該方法由Tag實體中的Doctrine2自動生成。如何限制結果(添加分頁等)?

回答

5

如果性能對你來說不是一個大問題,那麼使用Doctrine獲取對所有Question實體的引用並讓PHP執行過濾(而不是讓MySQL執行它)應該不是太大問題)。請記住,默認情況下,Doctrine不會返回完整的實體;相反,它返回一個代理對象(可以在以後通過另一個查詢可以更全面水合到數據庫):

class Question 
{ 
    public function getQuestions($offset = 0; $length = null) 
    { 
     return array_slice($this->questions, $offset, $length); 
    } 
} 

然而,如果性能是一個問題,你可能要考慮創建一個自定義庫類執行自定義DQL查詢或Doctrine的QueryBuilder類的方法:

class TagRepository 
{ 
    public function findSomeByQuestion($question, $offset, $length) 
    { 
     $qb = $this->createQueryBuilder("tag") 
      ->select("tag") 
      ->join("tag.questions", "questions") 
      ->where("question.id = :questionId") 
      ->setParameter("questionId", $question->getId()) 
      ->setFirstResult($offset) 
      ->setMaxResults($length); 
     return $qb->getQuery()->getResult(); 
    } 
}