Eager loading i zakresy zapytań
Zapobiegaj zapytaniom N+1 dzięki eager loadingowi i ponownie wykorzystuj logikę za pomocą zakresów zapytań
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 authorEager 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?
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
- Modele Eloquent i migracje
- CRUD z Eloquent
- Relacje Eloquent
- Eager loading i zakresy zapytań