La limitation des résultats par doctrine 2 avec pagination

Nous avons tous été confrontés à ce problème à un moment ou à un autre: nous devons mettre en place une pagination et donc ne requêter que sur un offset donné et retourner un nombre de résultat donné. Il existe des bundles qui gèrent cela, comme pagerFanta ou KnpPaginatorBundle (que je préfère, car il gère également le tri par colonne, ce qui est extrêmement pratique)

Mais si nous voulons coder nous-mêmes la pagination, pas de souci, c’est extrêmement simple en utilisant les fonctions setFirstResult (qui fixe l’offset) et setMaxResult(qui fixe la limite).

Mais lorsque nous utilisons cela… étrangement, nous n’obtenons que rarement le nombre de résultats voulu. Pourquoi? A cause des jointures. Voici ce que nous dit le site:

Paginating Doctrine queries is not as simple as you might think in the beginning. If you have complex fetch-join scenarios with one-to-many or many-to-many associations using the “default” LIMIT functionality of database vendors is not sufficient to get the correct results.

Pour contourner cette limitation, voici une solution que vous pouvez utiliser et qui fonctionne parfaitement:

/**
     * @param  Query  $query the query
     * @return array         the results
     */
    static function apply(Query $query) {
        $results = array();
        $paginator = new Paginator($query, $fetchJoinCollection = true);
        foreach($paginator as $result) {
            $results[] = $result;
        }
        return $results;
    }

 

Pas besoin de faire un getResult() après cela, la fonction retourne un array des objets attendus.

A vos paginations!

Rédigé par

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.