web-dev-qa-db-fra.com

doctrine limite et décalage du constructeur de requêtes

je suis un débutant symfony et je veux faire un blog avec le framework. j'utilise le référentiel pour obtenir des articles d'accueil avec cette méthode:

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

donc dans ma base de données j'ai 10 articles. Dans mon BlogController j'utilise:

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

Avec cela, je veux 4 articles. Mais en retour, j'ai aussi un article.

Quel est le problème?

18
Astram56

Il s'agit d'un know issuesetFirstResult() et setMaxResults() doivent être utilisés avec précaution si votre requête contient une collection jointe à l'extraction.

Comme indiqué sur Éléments de résultat premier et maximum :

Si votre requête contient une collection jointe à l'extraction spécifiant que les méthodes de limite de résultat ne fonctionnent pas comme prévu. Définir les résultats maximum limite le nombre de lignes de résultats de la base de données, cependant dans le cas de collections jointes par extraction, une entité racine peut apparaître dans plusieurs lignes, hydratant effectivement moins que le nombre spécifié de résultats.

Au lieu de cela, vous pouvez:

  1. Charge paresseuse

  2. utilisez le Paginateur (comme indiqué par @Marco ici)

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

29
Mick