Laravel chunk, et postgresql

chunk-laravel-postgresql

Contrairement à Mysql, Postgresql n’a aucun ORDER BY par défaut. Je veux dire, pour faire simple, le tri par id de base dans MySQL n’existe pas. Les résultats de requête sortent de manière totalement aléatoires.

Quand vous utilisez la méthode chunk() de Laravel (utile pour ne pas faire sauter toute la RAM de votre serveur) il se trouve que sous le capot, la méthode execute plusieurs fois la requête via la methode get() :

public function chunk($count, callable $callback)
    {
        $results = $this->forPage($page = 1, $count)->get();

        while (count($results) > 0) {
            // On each chunk result set, we will pass them to the callback and then let the
            // developer take care of everything within the callback, which allows us to
            // keep the memory low for spinning through large result sets for working.
            if (call_user_func($callback, $results) === false) {
                return false;
            }

            $page++;

            $results = $this->forPage($page, $count)->get();
        }

        return true;
    }

Regardez bien dans le while :

$results = $this->forPage($page, $count)->get();

Du coup, à chaque itération du chunk, vous envoyez une nouvelle requête. Mais rappelle toi, Postgresql va sortir les données de manière totalement aléatoires. Le résultat c’est qu’il y a pleins de doublons dans le résultat retourné.
Du coup, il faut simplement ajouter l’orderBy que tu veux dans ta requête, et tout roule !

metrogeek

Laisser un commentaire