2016-10-25 3 views
0

Ich habe 5 Benutzertitel, definiert durch booleans: CEO, Executive, Manager, Mitarbeiter & intern.Laravel Eloquent ORM: Gebaute geschachtelte bedingte Abfragen

Ich erstelle eine Benutzersuch-API und möchte eloquente Abfragen ein-/ausschalten und Benutzer mit ausgewählten Titeln zurückgeben.

Also, wenn ich für Führungskräfte und Mitarbeiter suchen waren, die Abfrage

$users = User::where(function($query) 
{ 
    $query->orWhere('manager')->orWhere('employee'); 
}) 
->where([ADDITIONAL CONSTRAINTS... (like age)])->get(); 

sein sollte, die am weitesten kam ich habe, ist:

$query = User::query(); 

//the respective titles are turned on by 1 and turned off by 0 
if($CEO) { 
$query = $query->orWhere('CEO'); 
} 

if($executive) { 
$query = $query->orWhere('executive'); 
} 

//And so on for each title 

Am Ende der zusätzlichen wo Einschränkungen hinzukommen wie this:

$users = $query->where([Additional constraints])->get(); 

Bei der Suche nach Managern und Mitarbeitern wäre die letzte Abfrage:

$users = User::orWhere('manager')->orWhere('employee') 

->where([ADDITIONAL CONSTRAINTS... (like age)])->get(); 

Das Ergebnis dieser Abfrage ist, dass die zusätzlichen Einschränkungen nicht immer erfüllt werden, weil es orWhere Abfragen vor, die für unerwünschte Instanzen erlauben ausgewählt werden.

Ich habe versucht, die orWhere mit Where's zu ersetzen, aber dann müssen die Benutzer positiv für jeden ausgewählten Titel überprüfen, um ausgewählt zu werden. Wenn ich also nach Managern und Mitarbeitern suchen möchte, bekomme ich vielleicht keine, weil es keinen Benutzer mit beiden Titeln gibt.

Das Ziel:

  1. ich all diese bedingten 'Titel-Abfragen' zusammen hinzufügen möchten.
  2. Setzen Sie alle in einem wo (Funktion ($ Abfrage) {$ Abfrage -> [alle 'Titel-Abfragen'];}).

Bemerkungen:

  1. Ich weiß, dass ich stattdessen auch jedes anderes Modell beseitigen könnte für gesuchte Modelle zu suchen. Wenn ich nach Managern und Mitarbeitern suchen würde, könnte ich für jeden unerwünschten Titel festlegen, wo ('CEO', '! =', 1) steht. Ich möchte das nicht, da Benutzer mit zwei Titeln, wie Mitarbeiter und Interim, in einigen Fällen ausgeschlossen werden.

  2. Ich weiß, dass ich verschachtelte bedingte Abfragen für jedes Szenario schreiben könnte also (Manager & ceo, Zwischen & ceo & Exekutive und auf ...), aber die 25-Abfragen dauern würde, und bin einfach nicht leicht skalierbar (exponentiell mehr Abfragen), wenn zusätzliche Benutzertitel hinzugefügt werden.

  3. Es muss eine redegewandte Lösung sein.

  4. Benutzer können mehrere Titel haben.

Ich habe intensiv über dieses Problem nachgedacht, danke!

Antwort

1

Vielleicht können Sie so etwas tun?(mit verwenden Sie Funktion Schlüsselwort)

<?php 

$filters = ['manager', 'employee']; 

$users = User::where(function($query) use($filters) { 
    foreach($filters as $filter) 
     $query = $query->orWhere($filter); 
}) 
->where([ADDITIONAL CONSTRAINTS... (like age)])->get(); 
+0

Vielen Dank! Deine Lösung funktioniert, die einzige Änderung, die ich gemacht habe, war, {} 's zur foreach-Schleife hinzuzufügen. Prost – Eltyer