Skip to main content

Was sind Scopes?

Eloquent-Scopes sind ein Mechanismus, um Einschränkungen für Queries zusammenzufassen und wiederzuverwenden. Es gibt zwei Arten von Scopes.

Lokale Scopes

Definition

Lokale Scopes definieren Sie, indem Sie einer Modellmethode das Attribut #[Scope] hinzufügen.
Das Attribut #[Scope] liegt im Namensraum Illuminate\Database\Eloquent\Attributes und ist native Syntax ab PHP 8.0.

Verwendung

Definierte Scopes lassen sich als Methoden aufrufen und verketten.

Parameter übergeben

Zusätzliche Parameter definieren Sie ab dem zweiten Argument der Scope-Methode.
Beim Aufruf übergeben Sie die Argumente einfach.

Kombination mit orWhere

Beim Verknüpfen von Scopes mit orWhere kann eine logische Gruppierung nötig werden.

Globale Scopes

Funktionsweise

Ein globaler Scope ist eine Klasse, die das Interface Illuminate\Database\Eloquent\Scope implementiert. Dieses Interface verlangt nur die Methode apply.
In apply fügen Sie dem Query Builder Einschränkungen hinzu.

Eine globale Scope-Klasse erstellen

Erzeugen Sie ein Gerüst mit dem Befehl make:scope.
Die Datei app/Models/Scopes/ActiveScope.php wird angelegt.

Auf das Modell anwenden

1

Registrierung über #[ScopedBy] (empfohlen)

In Laravel 13 ist die Registrierung über das Attribut #[ScopedBy] am einfachsten.
Mehrere Scopes werden als Array übergeben.
2

Manuelle Registrierung über booted()

Sie können auch die booted-Methode überschreiben und addGlobalScope aufrufen.
Nach dem Hinzufügen des globalen Scopes wird bei allen Queries wie User::all() automatisch WHERE is_active = 1 gesetzt.

Globaler Scope über eine anonyme Closure

Für einfache Scopes, die keine eigene Klasse rechtfertigen, können Sie Closures verwenden.
Um einen per Closure definierten Scope später auszuschließen, verwenden Sie nicht den Klassennamen, sondern den Scope-Namen (als String).

Globale Scopes ausschließen

Manchmal wollen Sie den Scope für eine bestimmte Query deaktivieren.

Framework-intern: SoftDeletingScope

Wenn Sie sich anschauen, wie der Standard-Trait SoftDeletes einen globalen Scope einsetzt, sehen Sie die Implementierungsmuster. SoftDeletingScope implementiert das Interface Scope.
withTrashed() ruft intern withoutGlobalScope($this) auf. Das heißt, es schließt den SoftDeletingScope selbst aus, sodass auch gelöschte Datensätze zurückgegeben werden.
onlyTrashed() schließt ebenfalls den Scope aus und fügt zusätzlich whereNotNull('deleted_at') hinzu.
Das Interface Scope verlangt keine extend-Methode, aber der Eloquent-Builder ruft sie automatisch auf, sofern der Scope sie besitzt. Nutzen Sie das, um eigene Makros hinzuzufügen.

Praktische Anwendungsfälle

Multi-Tenancy: automatische Filterung per Tenant-ID

In SaaS-Anwendungen ist es entscheidend, jede Query automatisch mit einem Tenant-ID-Filter zu versehen.
Damit liefert bereits Post::all() nur die Daten des Tenants des eingeloggten Nutzers.

Filter für veröffentlichte/nicht veröffentlichte Inhalte

Im Admin-Bereich wollen Sie auch unveröffentlichte Beiträge sehen, im Frontend nur veröffentlichte.
Im Admin schließen Sie den Scope mit withoutGlobalScope aus.

addSelect statt select verwenden

Wenn Sie in einem globalen Scope Spalten ergänzen, verwenden Sie addSelect und nicht select. Mit select überschreiben Sie die vom Aufrufer bereits festgelegten Spalten.

Nächste Schritte

Eigene Casts in Eloquent

Lernen Sie, wie Sie Attribut-Konvertierungslogik als eigene Casts umsetzen und Value-Object-Muster nutzen.
Zuletzt geändert am 13. Juli 2026