Eager Loading (Ładowanie z wyprzedzeniem)
- Problem N+1: Wielokrotne zapytania do bazy danych w pętli.
- Rozwiązanie: Użyj
with()
do załadowania powiązanych relacji.
// Problem N+1:
// $posts = Post::all();
// foreach ($posts as $post) { echo $post->user->name; } // N zapytań do userów
// Rozwiązanie:
$posts = Post::with('user')->get(); // Załaduje userów jednym zapytaniem
foreach ($posts as $post) { echo $post->user->name; }
// Ładowanie zagnieżdżonych relacji
$posts = Post::with('user.profile')->get();
// Ładowanie wielu relacji
$posts = Post::with(['user', 'comments'])->get();
// Ładowanie z warunkami na relacji
$posts = Post::with(['comments' => function ($query) {
$query->where('approved', true);
}])->get();
Scope'y
- Definiowanie wspólnych zestawów warunków zapytania.
- Dodaj metodę
scopeNazwaScopa
do modelu.
// W modelu Post
public function scopePublished($query)
{
return $query->where('published', true)->where('published_at', '<=', now());
}
// Użycie
$publishedPosts = Post::published()->get();
Global Scopes: Stosowane automatycznie do wszystkich zapytań danego modelu.
// W modelu
protected static function boot()
{
parent::boot();
static::addGlobalScope(new YourGlobalScope);
}
Casting (Rzutowanie)
- Automatyczne konwertowanie atrybutów na dany typ danych.
- Użyj właściwości
$casts
w modelu.
// W modelu Product
protected $casts = [
'is_active' => 'boolean',
'options' => 'array',
'price' => 'float',
'published_at' => 'datetime',
];
Obsługiwane typy: integer
, real
, float
, double
, string
, boolean
, object
, array
, collection
, date
, datetime
, timestamp
, encrypted
, AsEnum
.