Menu

Importer des millions de données avec Laravel upsert

Publié en January 2021 - Développement web, Logiciel Libre

laravel-query-upsert

Lorsque vous traitez un gros volume de données (des centaines de milliers, des millions ou plus), le même problème revient, comment importer toutes ces données en base de données en restant dans les limites systèmes de la taille de la mémoire ?

Avez-vous déjà essayé d'insérer ou de mettre à jour plusieurs millions de données dans une requête SQL avec Laravel ? N'essayez pas, ça n'est pas possible. Heureusement, Laravel 8 arrive avec une nouvelle méthode : upsert.

upsert permet d'insérer ou de mettre à jour plusieurs dizaines de milliers d'entrée dans votre base de données en une seule requête. Pour cela, Laravel va gérer automatiquement les timestamps ainsi que les clés de comparaison.

User::upsert(
    [
        ['email' => 'john@example.com', 'name' => 'John'],
        ['email' => 'doe@example.com',  'name' => 'Doe'],
    ],
    ['email'],
)

Dans cet exemple, on peut voir en premier argument les données formatés que l'on souhaite ajouter ou mettre à jour dans la table. Puis en deuxième argument la clé unique qui va servir de comparaison.

Laravel va ensuite automatiquement aller chercher dans la base de données les données qui existe déjà pour la valeur email, mettre à jour celles qui existent et ajouter les autres. Il est à noter que dans cette exemple, email doit être une clé unique.

La méthode upsert a fait son arrivée depuis la version 8 de Laravel et est disponible sur un modèle Eloquent ou directement sur le query builder.

Voir la documentation sur le site de Laravel.