Wat zijn scopes?
Scopes in Eloquent zijn een mechanisme om querybeperkingen te bundelen en te hergebruiken. Er zijn twee soorten scopes.Lokale scopes
Definitie
Een lokale scope definieer je door het#[Scope]-attribute op een modelmethode te zetten.
Het
#[Scope]-attribute staat in de namespace Illuminate\Database\Eloquent\Attributes. Het is native syntaxis van PHP 8.0 en later.Gebruik
Gedefinieerde scopes roep je aan als methodes. Chainen kan ook.Parameters doorgeven
Vanaf het tweede argument van een scopemethode kun je extra parameters definiëren.Combineren met orWhere
Wanneer je scopes met orWhere aan elkaar knoopt, is soms een logische groepering nodig.
Globale scopes
Werking
Een globale scope is een klasse die de interfaceIlluminate\Database\Eloquent\Scope implementeert. Deze interface vereist slechts één methode: apply.
apply-methode voeg je beperkingen toe aan de query builder.
Een globale scopeklasse maken
Genereer een sjabloon met het commandomake:scope.
app/Models/Scopes/ActiveScope.php gegenereerd.
Toepassen op een model
1
Registreren met het #[ScopedBy]-attribute (aanbevolen)
In Laravel 13 is het Meerdere scopes geef je op als array.
#[ScopedBy]-attribute het eenvoudigst.2
Handmatig registreren in de booted()-methode
Je kunt ook de
booted-methode overriden en addGlobalScope aanroepen.User::all(), automatisch WHERE is_active = 1.
Globale scopes met anonieme closures
Simpele scopes waarvoor een aparte klasse te veel is, kun je met een closure definiëren.Globale scopes uitsluiten
Soms wil je een scope voor een specifieke query uitschakelen.Framework-intern: SoftDeletingScope
Kijk je hoe de standaardSoftDeletes-trait van Laravel globale scopes benut, dan zie je het implementatiepatroon.
SoftDeletingScope implementeert de Scope-interface.
De implementatie van withTrashed() bekijken
De implementatie van withTrashed() bekijken
withTrashed() roept in werkelijkheid withoutGlobalScope($this) aan. Door de SoftDeletingScope zelf uit te sluiten, worden ook verwijderde records opgehaald.onlyTrashed() sluit de scope zelf uit en voegt daarbovenop whereNotNull('deleted_at') toe.Praktische use cases
Multitenancy: automatisch filteren op tenant-ID
In SaaS-applicaties is het belangrijk om op alle query’s automatisch een filter op tenant-ID toe te passen.Post::all() uitsluitend de tenantdata van de ingelogde gebruiker terug.
Openbaar/privé-filter
Voor als je in het beheerpaneel ook niet-gepubliceerde posts wilt tonen, maar in de frontend alleen gepubliceerde.withoutGlobalScope.
Gebruik addSelect in plaats van select
Volgende stap
Custom casts van Eloquent
Leer hoe je omzettingslogica voor attributen implementeert als custom cast en het value-objectpatroon toepast.