PHP Academy · Lekcja

Eager loading i zakresy zapytań

Zapobiegaj zapytaniom N+1 dzięki eager loadingowi i ponownie wykorzystuj logikę za pomocą zakresów zapytań

Lekcja 4 z 413 kroki

Eager loading i zakresy zapytań to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.

Problem N+1

Lazy loading wykonuje jedno zapytanie dla każdego modelu podczas uzyskiwania dostępu do relacji wewnątrz pętli — przy dużej skali może to mieć katastrofalne skutki.

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

Eager loading za pomocą with()

Rozwiąż problem N+1, wstępnie ładując relacje w jednym dodatkowym zapytaniu.

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

Eager loading wielu relacji

Załaduj jednocześnie kilka relacji.

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

Zagnieżdżony eager loading

Ładuj zagnieżdżone relacje za pomocą notacji kropkowej.

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

Eager loading z ograniczeniami

Zastosuj warunki do wstępnie załadowanej relacji.

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

withCount()

Załaduj liczbę powiązanych modeli bez ładowania samych powiązanych modeli.

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

Lazy eager loading (load())

Wstępnie załaduj relacje w już pobranej kolekcji za pomocą load().

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

Globalne zakresy zapytań

Globalne zakresy automatycznie dodają ograniczenia do wszystkich zapytań dotyczących danego modelu.

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

Lokalne zakresy zapytań

Lokalne zakresy to wielokrotnego użytku ograniczenia zapytań zdefiniowane w modelu jako metody z prefiksem 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();

Łączenie zakresów

Łącz wiele lokalnych zakresów, aby tworzyć czytelną i wielokrotnego użytku logikę zapytań.

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

Wykrywanie problemu N+1 podczas tworzenia aplikacji

Użyj Laravel Debugbar lub uruchom DB::enableQueryLog(), aby wykrywać nieoczekiwaną liczbę zapytań podczas tworzenia aplikacji.

Podsumowanie

Używaj with() do eager loadingu relacji i eliminowania zapytań N+1. Używaj withCount() do pobierania liczności. Definiuj lokalne zakresy, aby tworzyć wielokrotnego użytku i czytelne ograniczenia zapytań.

Szybkie sprawdzenie

Która metoda wykonuje eager loading powiązanych modeli, aby rozwiązać problem N+1?

Bezpłatny start

Ucz się PHP dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
49
Lekcje
195

Często zadawane pytania

Czy lekcja „Eager loading i zakresy zapytań” jest bezpłatna?

Tak — pełny tekst „Eager loading i zakresy zapytań” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Eager loading i zakresy zapytań”?

Zapobiegaj zapytaniom N+1 dzięki eager loadingowi i ponownie wykorzystuj logikę za pomocą zakresów zapytań Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć PHP Academy?

Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Eager loading i zakresy zapytań”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?

Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Modele Eloquent i migracje
  2. CRUD z Eloquent
  3. Relacje Eloquent
  4. Eager loading i zakresy zapytań
← Powrót do PHP Academy