Introductie
Eloquent biedt local scopes voor herbruikbare query-constraints en attribute casts voor automatische typeconversie. Door deze functies te gebruiken houd je querylogica DRY, zorg je voor consistente datatypes en maak je code expressiever. In combinatie met helpers zoals whereBelongsTo() maken ze Eloquent-queries overzichtelijker en minder foutgevoelig.
Waarom
- DRY queries: Local scopes halen herbruikbare query-constraints eruit, waardoor gedupliceerde
where-clausules door de hele codebase worden voorkomen - Typeveiligheid: Attribute casts converteren databasewaarden automatisch naar de juiste PHP-types (booleans, arrays, datums, decimalen)
- Overzichtelijkere queries:
whereBelongsTo()maakt hardgecodeerde foreign key-verwijzingen overbodig, waardoor relatiequeries beter leesbaar worden - Betere templates: Door datumkolommen te casten kun je Carbon-methoden direct in Blade-templates gebruiken in plaats van strings handmatig te parsen
Geschikt voor
- Elk model met herhaalde querypatronen (actieve gebruikers, gepubliceerde posts, enz.)
- Modellen met JSON-, boolean-, decimal- of datumkolommen
- Applicaties die Blade of API-responses gebruiken die datums formatteren
Minder geschikt voor
- Eenmalige queries die nergens worden hergebruikt
- Global scopes moeten spaarzaam worden gebruikt, geef voor de meeste filterbehoeften de voorkeur aan local scopes
Voorbeelden
Local scopes
// Bad: duplicated query logic
$active = User::where('verified', true)->whereNotNull('activated_at')->get();
$articles = Article::whereHas('user', function ($q) {
$q->where('verified', true)->whereNotNull('activated_at');
})->get();
// Good: reusable local scope
public function scopeActive(Builder $query): Builder
{
return $query->where('verified', true)->whereNotNull('activated_at');
}
$active = User::active()->get();
$articles = Article::whereHas('user', fn ($q) => $q->active())->get();
Global scopes, spaarzaam gebruiken
Global scopes passen elke query op het model stilzwijgend aan, wat debuggen bemoeilijkt. Reserveer ze voor werkelijk universele constraints zoals soft deletes of multi-tenancy. Geef voor al het andere de voorkeur aan local scopes.
Attribute casts
Gebruik de casts()-methode voor automatische typeconversie:
protected function casts(): array
{
return [
'is_active' => 'boolean',
'metadata' => 'array',
'total' => 'decimal:2',
];
}
Cast datumkolommen correct
// Bad: manual date parsing in templates
{{ Carbon::createFromFormat('Y-d-m H-i', $order->ordered_at)->toDateString() }}
// Good: cast in the model
protected function casts(): array
{
return [
'ordered_at' => 'datetime',
];
}
// Then use directly in Blade
{{ $order->ordered_at->toDateString() }}
{{ $order->ordered_at->format('m-d') }}
Gebruik whereBelongsTo()
// Bad: hardcoded foreign key
Post::where('user_id', $user->id)->get();
// Good: cleaner and relationship-aware
Post::whereBelongsTo($user)->get();
Post::whereBelongsTo($user, 'author')->get();