2013-02-14 9 views
9

Jestem początkującym symfony i chcę zrobić blog z ramami. Używam repozytorium, aby uzyskać artykuły w domu za pomocą tej metody:Ograniczenie i przesunięcie querybuilder doktryny

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(); 
} 

tak w mojej bazie danych mam 10 artykułów. W moim BlogController używam:

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

Z tym chcę 4 artykuły. Ale w zamian mam też jeden artykuł.

Na czym polega problem?

+0

Cóż, wszystko wygląda dobrze oprócz "addSelect (" c ') "spróbuj usunąć ten wiersz kodu. Upewnij się również, że w bazie danych jest naprawdę 10 lub więcej komentarzy. No cóż, artykuł [url] http://stackoverflow.com/questions/10701792/doctrine2-limiting-with-left-joins-pagination-best-practice [/ url] może pomóc. –

+0

dziękuję Vadim. Mam 10 artykułów (i 20 komentarzy). Próbuję usunąć addSelect, ale to nie działa. nie rozumiem, dlaczego ten kod nie działa ... – Astram56

Odpowiedz

22

To jest know issue, gdzie setFirstResult() i setMaxResults() należy używać ostrożnie, jeśli zapytanie zawiera kolekcję dołączoną do pobrania.

Jak wspomniano o First and Max Result Items:

Jeśli zapytanie zawiera sprowadzić mikrowczepy kolekcję określających dopuszczalne sposoby wynik nie działa jak można oczekiwać. Ustaw maksymalne wyniki ogranicza liczbę wierszy wyników w bazie danych, jednak w przypadku zbieranych połączonych kolekcji jedna jednostka główna może pojawić się w wielu wierszach, skutecznie nawadniając mniej niż określona liczba wyników.

Zamiast można:

  1. Lazy obciążenie

  2. użycie the Paginator (jak stwierdził @Marco here)

  3. użytkowania Doctrine\Common\Collections\Collection::slice()

Powiązane problemy