PHP Academy · Lektion

Eager Loading und Query Scopes

Verhindern Sie N+1-Abfragen mit Eager Loading und verwenden Sie Logik mit Query Scopes wieder.

Lektion 4 von 413 Schritte

Eager Loading und Query Scopes ist eine kostenlose PHP Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des PHP Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.

Das N+1-Problem

Beim Lazy Loading wird für jedes Model eine Abfrage ausgeführt, wenn innerhalb einer Schleife auf eine Beziehung zugegriffen wird – bei großen Datenmengen katastrophal.

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

Eager Loading mit with()

Beheben Sie das N+1-Problem, indem Sie Beziehungen vorab mit einer zusätzlichen Abfrage laden.

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

Mehrere Beziehungen per Eager Loading laden

Laden Sie mehrere Beziehungen gleichzeitig.

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

Verschachteltes Eager Loading

Laden Sie verschachtelte Beziehungen mithilfe der Punktnotation.

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

Eingeschränktes Eager Loading

Wenden Sie Bedingungen auf die per Eager Loading geladene Beziehung an.

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

withCount()

Laden Sie die Anzahl eines verbundenen Models, ohne die verbundenen Modelle selbst zu laden.

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

Lazy Eager Loading (load())

Laden Sie Beziehungen mit load() per Eager Loading in einer bereits abgerufenen Collection.

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

Globale Query Scopes

Globale Scopes fügen allen Abfragen für ein Model automatisch Einschränkungen hinzu.

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

Lokale Query Scopes

Lokale Scopes sind wiederverwendbare Abfrageeinschränkungen, die im Model als Methoden mit dem Präfix scope definiert werden.

<?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();

Scopes kombinieren

Verketten Sie mehrere lokale Scopes für eine lesbare und wiederverwendbare Abfragelogik.

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

N+1 in der Entwicklung erkennen

Verwenden Sie Laravel Debugbar oder führen Sie DB::enableQueryLog() aus, um während der Entwicklung unerwartete Abfragezahlen zu erkennen.

Zusammenfassung

Verwenden Sie with(), um Beziehungen per Eager Loading zu laden und N+1-Abfragen zu vermeiden. Verwenden Sie withCount() für Zählwerte. Definieren Sie lokale Scopes für wiederverwendbare und lesbare Abfrageeinschränkungen.

Schnelltest

Welche Methode lädt verbundene Modelle per Eager Loading, um das N+1-Problem zu beheben?

Kostenlos starten

Lerne PHP mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
49
Lektionen
195

Häufig gestellte Fragen

Ist die Lektion „Eager Loading und Query Scopes“ kostenlos?

Ja — der vollständige Text von „Eager Loading und Query Scopes“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des PHP Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der PHP Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Eager Loading und Query Scopes“?

Verhindern Sie N+1-Abfragen mit Eager Loading und verwenden Sie Logik mit Query Scopes wieder. Du übst PHP Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um PHP Academy zu starten?

Keine Vorkenntnisse erforderlich. PHP Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Eager Loading und Query Scopes“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser PHP Academy-Lektion Code schreiben und ausführen?

Ja. Jede PHP Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Eloquent-Modelle und Migrationen
  2. CRUD mit Eloquent
  3. Eloquent-Beziehungen
  4. Eager Loading und Query Scopes
← Zurück zu PHP Academy