0Pricing
PHP Academy · Leçon

Chargement anticipé et portées de requête

Éviter les requêtes N+1 grâce au chargement anticipé et réutiliser la logique avec les portées de requête.

Chargement anticipé et portées de requête est une leçon PHP Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PHP Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PHP Academy comprend 4 leçons au total.

Le problème N+1

Le chargement différé exécute une requête par modèle lorsqu’une relation est consultée dans une boucle — ce qui devient catastrophique à grande échelle.

<?php
$posts = Post::all(); // 1 query
foreach ($posts as $post) {
    echo $post->author->name; // 1 query per post = N+1 total!
}

Chargement anticipé avec with()

Résolvez le problème N+1 en chargeant les relations à l’avance dans une requête supplémentaire.

<?php
$posts = Post::with("author")->get(); // 2 queries total
foreach ($posts as $post) {
    echo $post->author->name; // no extra query
}

Chargement anticipé de plusieurs relations

Chargez plusieurs relations en une seule fois.

<?php
$posts = Post::with(["author", "tags", "comments"])->get();

Chargement anticipé imbriqué

Chargez des relations imbriquées en utilisant la notation avec points.

<?php
$posts = Post::with("comments.author")->get();
// Loads posts, their comments, and each comment's author

Chargement anticipé avec contraintes

Appliquez des conditions à la relation chargée à l’avance.

<?php
$posts = Post::with(["comments" => function ($q) {
    $q->where("approved", true)->latest();
}])->get();

withCount()

Chargez le nombre de modèles associés sans charger les modèles associés eux-mêmes.

<?php
$posts = Post::withCount("comments")->get();
foreach ($posts as $post) {
    echo $post->comments_count;
}

Chargement anticipé différé (load())

Chargez à l’avance les relations d’une collection déjà récupérée avec load().

<?php
$posts = Post::all();
// Later, when you know you need the authors:
$posts->load("author");

Portées de requête globales

Les portées globales ajoutent automatiquement des contraintes à toutes les requêtes d’un modèle.

<?php
class PublishedScope implements \Illuminate\Database\Eloquent\Scope {
    public function apply(Builder $builder, Model $model): void {
        $builder->where("is_published", true);
    }
}

Portées de requête locales

Les portées locales sont des contraintes de requête réutilisables, définies dans le modèle sous forme de méthodes préfixées par scope.

<?php
class Post extends Model {
    public function scopePublished(Builder $query): void {
        $query->where("is_published", true);
    }
    public function scopeByUser(Builder $query, int $userId): void {
        $query->where("user_id", $userId);
    }
}
// Usage:
Post::published()->byUser(1)->latest()->get();

Combiner des portées

Enchaînez plusieurs portées locales pour obtenir une logique de requête lisible et réutilisable.

<?php
$posts = Post::published()
             ->byUser(auth()->id())
             ->orderBy("created_at", "desc")
             ->paginate(15);

Détecter les problèmes N+1 en développement

Utilisez Laravel Debugbar ou exécutez DB::enableQueryLog() pour détecter le nombre inattendu de requêtes pendant le développement.

Résumé

Utilisez with() pour charger les relations à l’avance et éliminer les requêtes N+1. Utilisez withCount() pour obtenir des décomptes. Définissez des portées locales pour des contraintes de requête réutilisables et lisibles.

Vérification rapide

Quelle méthode charge les modèles associés à l’avance pour résoudre le problème N+1 ?

Questions Fréquemment Posées

La leçon « Chargement anticipé et portées de requête » est-elle gratuite ?

Oui — le texte complet de « Chargement anticipé et portées de requête » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PHP Academy, passe à CoddyKit PRO. Le cours PHP Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Chargement anticipé et portées de requête » ?

Éviter les requêtes N+1 grâce au chargement anticipé et réutiliser la logique avec les portées de requête. Tu pratiques PHP Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer PHP Academy ?

Aucune expérience préalable n'est requise. PHP Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Chargement anticipé et portées de requête » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon PHP Academy ?

Oui. Chaque leçon PHP Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèles Eloquent et migrations
  2. CRUD avec Eloquent
  3. Relations Eloquent
  4. Chargement anticipé et portées de requête
← Retour à PHP Academy