Laravel Scopes: Eloquent-Abfragen wiederverwendbar machen

Lokale Scopes bündeln eine wiederkehrende Eloquent-Abfrage im Modell: einmal als scopeAdmin() definiert, wird daraus User::admin(), und du änderst die Bedingung später an einer einzigen Stelle.

Laravel Scopes: Eloquent-Abfragen wiederverwendbar machen
Die Scopes von Laravel sind ausgesprochen praktisch, sobald du dieselben Daten immer wieder abfragst. Nebenbei werden deine Abfragen leichter lesbar und leichter zu pflegen.

Wenn dir die Scopes von Laravel noch nichts sagen, bist du hier genau richtig 😉 .

Was Scopes sind

Laravel kennt zwei Arten von Scopes: globale und lokale. Der Einfachheit halber behandle ich hier nur die lokalen Scopes, wirf bei Gelegenheit trotzdem einen Blick auf die globalen Scopes.

Was ist also ein lokaler Query-Scope in Laravel? Gute Frage. Hier ein Beispiel für einen lokalen Scope in einem User-Modell:

php
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    public function scopeAdmin($query)
    {
        return $query->where('admin', 1);
    }
}

Im Codebeispiel oben siehst du die Methode scopeAdmin, die ein $query zurückgibt, in dem die Spalte admin den Wert 1 hat. Jetzt, wo du einen lokalen Scope gesehen hast, schauen wir uns an, wie du ihn einsetzt.

Scopes verwenden

Willst du scopeAdmin im Projekt nutzen, um eine Collection aller Admin-Nutzer zu bekommen, genügt folgender Code:

php
$admins = User::admin()->all();

Damit bekommst du alle admin aus der Datenbank.

Damit dürfte klar werden, wie mächtig Scopes sind, wie viel Zeit sie sparen und wie viel lesbarer sie deinen Code machen. Falls dich das noch nicht überzeugt, lies weiter: Das nächste Beispiel zeigt, wie sehr sie dir das Leben erleichtern.

Warum Scopes

Zurück zu den bisherigen Beispielen: Angenommen, die Abfrage soll nur noch die admin liefern, bei denen die Spalte active den Wert 1 hat. Ohne Scopes müsstest du im gesamten Code nach dieser Abfrage suchen:

php
$admins = User::where('admin', 1)->all();

Und sie ersetzen durch:

php
$admins = User::where('admin', 1)->where('active', 1)->all();

Mit Scopes dagegen passt du einfach den Scope an:

php
public function scopeAdmin($query)
{
    return $query->where('admin', 1)->where('active', 1);
}

Und schon liefern sämtliche bestehenden Abfragen die Admin-Nutzer, bei denen active den Wert 1 hat. Dein Code wird dadurch effizienter, wartbarer und lesbarer.

Fazit

Scopes verlagern die Logik in deine Eloquent-Modelle, statt sie direkt in Views und Controllern unterzubringen. Das macht dein Projekt wartbarer und lesbarer.

Ich hoffe, dieser Artikel hat dir die Scopes von Laravel nähergebracht und du setzt sie in deinen nächsten Laravel-Projekten ein ✌️.

Laravel

Damien Flandrin Webentwickler seit 2010, Gründer von Gekkode und Email Impact. Jeder Artikel wird vor der Veröffentlichung an einem echten Projekt getestet. Kontakt
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.