Skip to main content

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.
Bij het aanroepen geef je de argumenten direct door.

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 interface Illuminate\Database\Eloquent\Scope implementeert. Deze interface vereist slechts één methode: apply.
In de apply-methode voeg je beperkingen toe aan de query builder.

Een globale scopeklasse maken

Genereer een sjabloon met het commando make:scope.
Er wordt een app/Models/Scopes/ActiveScope.php gegenereerd.

Toepassen op een model

1

Registreren met het #[ScopedBy]-attribute (aanbevolen)

In Laravel 13 is het #[ScopedBy]-attribute het eenvoudigst.
Meerdere scopes geef je op als array.
2

Handmatig registreren in de booted()-methode

Je kunt ook de booted-methode overriden en addGlobalScope aanroepen.
Voeg je een globale scope toe, dan krijgen alle query’s, zoals 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.
Wil je een met een closure gedefinieerde scope later uitsluiten, dan moet je de scopenaam (string) gebruiken in plaats van een klassenaam.

Globale scopes uitsluiten

Soms wil je een scope voor een specifieke query uitschakelen.

Framework-intern: SoftDeletingScope

Kijk je hoe de standaard SoftDeletes-trait van Laravel globale scopes benut, dan zie je het implementatiepatroon. SoftDeletingScope implementeert de Scope-interface.
withTrashed() roept in werkelijkheid withoutGlobalScope($this) aan. Door de SoftDeletingScope zelf uit te sluiten, worden ook verwijderde records opgehaald.
Ook onlyTrashed() sluit de scope zelf uit en voegt daarbovenop whereNotNull('deleted_at') toe.
De Scope-interface definieert geen extend-methode, maar de builder van Eloquent roept extend automatisch aan als de scope die methode heeft. Handig wanneer je eigen macro’s wilt toevoegen.

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.
Nu geeft alleen al het aanroepen van 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.
In het beheerpaneel sluit je de scope uit met withoutGlobalScope.

Gebruik addSelect in plaats van select

Wil je in een globale scope kolommen toevoegen, gebruik dan addSelect in plaats van select. Met select overschrijf je de kolommen die de aanroepende query al selecteert.

Volgende stap

Custom casts van Eloquent

Leer hoe je omzettingslogica voor attributen implementeert als custom cast en het value-objectpatroon toepast.
Laatst gewijzigd op 6 september 2026