Wie man Abfragen mit mehreren WHERE-Bedingungen in Laravel Eloquent erstellt
Haben Sie sich jemals dabei ertappt, wie Sie dachten: „Ich muss Datensätze nach drei verschiedenen Bedingungen filtern, aber die Eloquent-Syntax ist irgendwie verwirrend“? Wenn ja – Sie sind nicht allein. Die Frage „How to Create Multiple Where Clause Query Using Laravel Eloquent?“ auf Stack Overflow hat tausende Aufrufe gesammelt, und das ist nicht verwunderlich. Die Arbeit mit der Datenbank ist das Herz jeder PHP-Anwendung, und die Fähigkeit, komplexe Abfragen zu erstellen, unterscheidet einen Anfänger von einem Profi.
In diesem Artikel behandeln wir alle Methoden zur Erstellung mehrerer WHERE-Bedingungen in Laravel Eloquent: von einfachen Verkettungen bis hin zu verschachtelten logischen Konstrukten. Sie erfahren, wie Sie AND und OR kombinieren, whereHas für verknüpfte Modelle verwenden und typische Fehler vermeiden. Los geht‘s!
Grundlegende Syntax: WHERE-Verkettung
Der offensichtlichste Weg, mehrere Bedingungen hinzuzufügen, ist einfach where() mehrmals hintereinander aufzurufen. Standardmäßig werden alle Bedingungen mit AND verknüpft.
// Alle Benutzer abrufen, bei denen status = 'active' UND role = 'admin'$users = User::where('status', 'active') ->where('role', 'admin') ->get();
// Äquivalentes SQL:// SELECT * FROM users WHERE status = 'active' AND role = 'admin'Man kann auch ein Array von Bedingungen übergeben:
$users = User::where([ ['status', '=', 'active'], ['role', '=', 'admin'],])->get();Beide Varianten funktionieren, aber die erste ist leichter lesbar, besonders wenn es viele Bedingungen gibt.
OR-Bedingung: Wenn „oder“ benötigt wird
Was aber, wenn wir Benutzer finden müssen, die ENTWEDER aktiv ODER Administratoren sind? Hier kommt orWhere() ins Spiel.
// Benutzer, bei denen status = 'active' ODER role = 'admin'$users = User::where('status', 'active') ->orWhere('role', 'admin') ->get();
// SQL: SELECT * FROM users WHERE status = 'active' OR role = 'admin'⚠️ Wichtiger Hinweis: Wenn Sie where und orWhere mischen, denken Sie an die Operator-Priorität. Laravel verarbeitet sie sequenziell, daher kann das Ergebnis von der Erwartung abweichen.
Beispiel mit einer Stolperfalle
// Gewünscht: (status = 'active' AND role = 'admin') OR (plan = 'premium')$users = User::where('status', 'active') ->where('role', 'admin') ->orWhere('plan', 'premium') ->get();
// SQL: WHERE status = 'active' AND role = 'admin' OR plan = 'premium'// Das ist NICHT dasselbe!Um das korrekte Ergebnis zu erhalten, verwenden Sie Gruppierung mit einem Closure:
$users = User::where(function ($query) { $query->where('status', 'active') ->where('role', 'admin');})->orWhere('plan', 'premium') ->get();
// SQL: WHERE (status = 'active' AND role = 'admin') OR plan = 'premium'Verschachtelte WHERE: Gruppierung von Bedingungen
Wenn die Logik komplexer wird, helfen verschachtelte Closures. Dies ist das leistungsfähigste Werkzeug zur Erstellung komplexer Bedingungen.
// (age > 18 AND status = 'active') OR (age <= 18 AND parent_approved = 1)$users = User::where(function ($query) { $query->where('age', '>', 18) ->where('status', 'active');})->orWhere(function ($query) { $query->where('age', '<=', 18) ->where('parent_approved', 1);})->get();Der Code liest sich wie ein Buch: „Finde Benutzer, die volljährig und aktiv sind, ODER minderjährig mit elterlicher Zustimmung“.
Bedingungen mit Operatoren: WHERE IN, BETWEEN, NULL
Eloquent unterstützt alle standardmäßigen SQL-Operatoren. Hier sind einige nützliche:
whereIn – Prüfung auf Enthaltensein in einer Liste
<