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.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 InterfaceIlluminate\Database\Eloquent\Scope implementiert. Dieses Interface verlangt nur die Methode apply.
apply fügen Sie dem Query Builder Einschränkungen hinzu.
Eine globale Scope-Klasse erstellen
Erzeugen Sie ein Gerüst mit dem Befehlmake:scope.
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 Mehrere Scopes werden als Array übergeben.
#[ScopedBy] am einfachsten.2
Manuelle Registrierung über booted()
Sie können auch die
booted-Methode überschreiben und addGlobalScope aufrufen.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.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-TraitSoftDeletes einen globalen Scope einsetzt, sehen Sie die Implementierungsmuster.
SoftDeletingScope implementiert das Interface Scope.
Implementierung von withTrashed() ansehen
Implementierung von withTrashed() ansehen
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.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.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.withoutGlobalScope aus.
addSelect statt select verwenden
Nächste Schritte
Eigene Casts in Eloquent
Lernen Sie, wie Sie Attribut-Konvertierungslogik als eigene Casts umsetzen und Value-Object-Muster nutzen.