2013-02-14 16 views
9

Sono un principiante di symfony e voglio creare un blog con il framework. Io uso repository per ottenere articoli a casa con questo metodo:limite e offset di doctrine querybuilder

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

quindi nel mio database ho 10 articoli. Io uso il mio BlogController:

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

Con questo voglio 4 articoli. Ma in cambio ho anche un articolo.

Qual è il problema?

+0

Bene, tutto sembra a posto tranne "addSelect ('c')" prova a rimuovere questa riga di codice. Assicurarsi inoltre che ci siano veramente 10 o più commenti nel database. Oh, bene, questo articolo [url] http://stackoverflow.com/questions/10701792/doctrine2-limiting-with-left-joins-pagination-best-practice [/ url] potrebbe aiutare. –

+0

grazie Vadim. ho 10 articoli (e 20 commenti). provo a rimuovere addSelect ma non funziona. non capisco perché questo codice non funziona ... – Astram56

risposta

22

Questo è un know issue dove setFirstResult() e setMaxResults() bisogno di essere utilizzato con attenzione se la query contiene una collezione prendere incollati.

Come dichiarato su First and Max Result Items:

Se la query contiene una collezione prendere incollati a specificare le modalità limite risultato non funzionano come ci si aspetterebbe. Imposta i risultati massimi limita il numero di righe di risultati del database, tuttavia nel caso di collezioni fetch-join un'entità di root potrebbe apparire in più righe, idratando efficacemente meno del numero specificato di risultati.

Invece, è possibile:

  1. pigro carico

  2. uso the Paginator (come dichiarato dal @Marco here)

  3. Usa Doctrine\Common\Collections\Collection::slice()

Problemi correlati