Eloquent — 10 dobrych praktyk, które oszczędzają godziny debugowania
N+1, eager loading, scopes, mutators, casts — co naprawdę warto wiedzieć o ORM-ie Laravela, żeby nie utopić projektu w wolnych zapytaniach.
Eloquent to jedna z najbardziej eleganckich warstw ORM w świecie PHP. Łatwo polubić, łatwo nadużyć. Dziesięć praktyk, które oszczędzają realne godziny pracy.
1. Eager loading — zawsze gdy idzie po relacji
Klasyczny N+1: ładujesz 100 postów i potem w pętli sięgasz po autora każdego. To 101 zapytań. Rozwiązanie:
Post::with('author')->get();
Włącz Model::preventLazyLoading() w lokalnym/staging — wybuchnie wszędzie, gdzie zapomniałeś.
2. Select tylko potrzebnych kolumn
Zwracanie 30 kolumn kiedy potrzebujesz 3 to marnotrawstwo, szczególnie przy dużych tabelach z TEXT/JSON polami.
User::select('id', 'name', 'email')->get();
3. Chunk dla dużych zbiorów
Iterowanie 100 000 rekordów przez get() zarżnie pamięć. Użyj chunka:
User::chunk(500, function ($users) {
foreach ($users as $user) { /* ... */ }
});
4. Scopes zamiast powtarzania warunków
// W modelu
public function scopeActive($query) {
return $query->where('is_active', true);
}
// W kodzie
User::active()->get();
5. Mutators i casts dla typów
Niech model sam dba o konwersje:
protected $casts = [
'is_active' => 'boolean',
'metadata' => 'array',
'published_at' => 'datetime',
];
6. Indeksy w bazie
Eloquent niczego za Ciebie nie zaindeksuje. Wszystkie kolumny po których filtrujesz, joinujesz, sortujesz — muszą mieć index. Sprawdź EXPLAIN dla wolnych zapytań.
7. whereHas vs whereExists
whereHas('orders') generuje subquery z JOIN-em i potrafi być powolne. Dla prostych „istnieje czy nie" — whereExists jest często szybsze.
8. Soft deletes — używaj z głową
Soft deletes są wygodne, ale każde zapytanie dostaje dodatkowy warunek deleted_at IS NULL. Dla często odpytywanych tabel — index na deleted_at obowiązkowy.
9. Repository pattern — niepotrzebny w 90% przypadków
Klasyczny Eloquent jest już abstrakcją nad bazą. Dodawanie repozytoriów „bo wzorzec" zwykle tylko utrudnia kod. Wprowadź je tylko gdy masz wiele źródeł danych lub wymóg testowalności bez bazy.
10. Query log w developmencie
Włącz logowanie zapytań w środowisku lokalnym i okresowo przeglądaj. Najgorsze zapytania zwykle pochodzą z miejsc, których nawet nie podejrzewałeś.
DB::enableQueryLog();
// kod
dd(DB::getQueryLog());
Masz pytania?
Pomożemy wdrożyć rozwiązania z tego artykułu na Twojej stronie. Bezpłatna konsultacja.
Skontaktuj się z nami