burger menu icon Web^ID
💬 Contact 💬 Contact
18 06 2025
retour à la liste des articles

Plongeons dans le monde des Lazy Collections de Laravel

logo web^id

• écrit par [Elise LIéGEOIS] Développeuse

marqueur jaune Default image alt

Vous avez probablement déjà été confronté à la nécessité d'optimiser les performances d'un projet devenu soudainement lent. Dans le développement d'applications Laravel modernes, la gestion efficace de grandes quantités de données est un défi majeur. Que vous anticipiez une croissance significative de votre base de données ou que vous sachiez dès le départ que vous allez manipuler un grand nombre d'enregistrements, les Lazy Collections peuvent être votre sauveur. Introduites dans Laravel 6, elles offrent une solution révolutionnaire pour optimiser les performances, notamment lorsque vous devez traiter des ensembles de données volumineux.

Qu’est-ce qu’une Lazy Collections ?

Une Lazy Collection est une collection qui utilise l'évaluation paresseuse (lazy evaluation), ce qui signifie qu'elle ne calcule ou ne charge les données qu'au moment où c'est nécessaire. Contrairement aux collections traditionnelles qui stockent tous leurs éléments en mémoire dès le départ, les Lazy Collections exploitent les générateurs PHP pour traiter les données élément par élément, de manière séquentielle et optimisée.

// Collection traditionnelle - Charge tout en mémoire 

Pourquoi les utiliser ?

  • Économie de Mémoire : Comme les données sont traitées une par une, vous n'avez pas besoin de tout charger en mémoire.

  • Performance : En traitant les données de manière paresseuse, vous réduisez la charge sur votre serveur et améliorez les temps de réponse de votre application.

  • Simplicité : Les Lazy Collections sont faciles à utiliser et s'intègrent parfaitement avec le reste de Laravel. C'est comme avoir un super pouvoir sans avoir à apprendre un nouveau sort.

Méthodes principales des Lazy Collections

1️⃣ Lazy() - "Le minutieux"

C’est la méthode de base pour créer une lazy collection depuis une requête Eloquent. Elle charge les enregistrements un par un de manière séquentielle.

User::lazy()->each(

Ce qu'il se passe sous le capot :

-- Une seule requête avec curseur


Ses superpouvoirs :

  • Mémoire de poisson rouge : ne se souvient que de ce qu'il a en main

  • Précision absolue : jamais d'erreur, jamais de doublon

  • Minimalisme extrême : occupe zéro espace de stockage


Ses faiblesses :

  • Très lent

  • Fait autant d'aller / retour que de données

  • Risque de s'endormir avant la fin !

  • Totalement incompatible avec paginate()

Conseil : Si vous avez besoin de vraie pagination, c'est mieux d'utiliser lazyBy() ou lazyById() selon le volume de données !

2️⃣ LazyBy() - "L'organisateur"

Charge les enregistrements par chunks (groupes) d'une taille spécifiée, mais les retourne un par un dans l'itération.

User::lazyBy()->each(

Ce qu'il se passe sous le capot :

-- Première requête
SELECT * FROM users LIMIT 1000 OFFSET 0

-- Deuxième requête  
SELECT * FROM users LIMIT 1000 OFFSET 1000

-- Troisième requête
SELECT * FROM users LIMIT 1000 OFFSET 2000

Ses superpouvoirs :

  • Stratège équilibré : ni trop rapide, ni trop lent

  • Adaptable : peut choisir la taille de ses chunks

  • Maître de l'équilibre : bon compromis entre vitesse et mémoire

Ses faiblesses :

  • Parfois les chunks peuvent être trop importants

  • Peut perdre le compte si quelqu'un ajoute des données lorsqu'il travaille

  • Plus il y a de chunks, plus il ralentit à cause de la fatigue

  • On ne peux pas combiner lazyBy() avec paginate() ou simplePaginate()

3️⃣ LazyById() - "Le Ninja des Gros Volumes"

Il est optimisé pour les tables avec des clés primaires auto-incrémentées. Il utilise la stratégie "keyset pagination" qui est plus efficace sur de très grandes tables.

User::lazyById()->each(

Ce qu'il se passe sous le capot :

-- Première requête
SELECT * FROM users WHERE id > 0 ORDER BY id LIMIT 1000

-- Deuxième requête  
SELECT * FROM users WHERE id > 1000 ORDER BY id LIMIT 1000

-- Troisième requête
SELECT * FROM users WHERE id > 2000 ORDER BY id LIMIT 1000

Ses superpouvoirs :

  • Rapide : même sur des millions de données

  • Utilise WHERE id > ? au lieu d'OFFSET

  • Navigation GPS : trouve instantanément le bon endroit

  • Jamais perdu : peut reprendre exactement où il s'était arrêté

  • Super-héros des gros volumes : plus il y en a, plus il brille !

Ses faiblesses :

  • Rigide : impossible de changer l'ordre de collection

  • Un peu robot : moins flexible que ses collègues

  • Fonctionne seulement avec des clés auto-incrémentées

  • On ne peux pas combiner lazyById() avec paginate() ou simplePaginate()

Du coup, comment choisir la bonne collection ?

Chacun a sa personnalité et ses moments de gloire ! Le secret, c'est de choisir la bonne collection pour la bonne mission :

  1. Mission de 1000 éléments

Lazy() : "Parfait ! J'ai tout mon temps pour être minutieux !"
LazyBy() : "Facile, 1 chunk et c'est plié !"
LazyById() : "Sérieusement ? Pour si peu ? Bon... si tu veux..."

  1. Mission de 100 000 éléments

Lazy() : "Euh... on se revoit l'année prochaine ?"
LazyBy() : "C'est mon moment de gloire ! 100 chunks, j'arrive !"
LazyById() : "Pfff, facile ! 50 téléportation et c'est dans la poche !"

  1. Mission de 10 millions d'éléments

Lazy() : "Je... je crois que je vais prendre ma retraite..."
LazyBy() : "Mes chunks deviennent trop lourds... je ralentis..."
LazyById() : "ENFIN ! C'est parti pour le spectacle !"

Conclusion

  • Lazy() => Un à la fois, tout seul dans sa grotte

  • LazyBy() => Par paquets, équilibré et malin

  • LazyById() => Navigation ultra-rapide par ID

Les Lazy Collections de Laravel sont un outil puissant pour optimiser les performances de vos applications, surtout lorsque vous travaillez avec de grandes quantités de données. Elles vous permettent de traiter les données de manière efficace, en économisant de la mémoire et en améliorant les performances. L'adoption des Lazy Collections dans vos projets Laravel, combinée avec une architecture bien pensée et un monitoring approprié, peut rendre vos applications plus rapides et plus réactives, tout en gardant un code propre et facile à maintenir.

N'oubliez pas de toujours mesurer l'impact de vos optimisations et d'adapter la taille des chunks selon vos besoins spécifiques.

Rédigé par :

filaire image filaire image
Vous souhaitez démarrer rapidement ?
Besoin d'accompagnement ?

Vous voulez en savoir plus ou vous souhaitez nous parler de votre projet ?
Nous sommes à votre disposition !