2017-09-16 1 views
0

Hier ist das Szenario. Nehmen wir an, ich habe eine Tabelle Foo mit zwei Spalten, bar und baz. Ich möchte eine Bedingung sowohl für bar als auch für baz überprüfen. Diese Bedingung gilt nur für eine der beiden Spalten. Für welche Spalte es auch gilt, ich möchte die andere Spalte auswählen.Wie kann man bedingt auswählen, welche Spalte basierend auf der WHERE-Klausel in einer einzigen Abfrage SELECT wird?

Ich kann dies als zwei separate Abfragen schreiben, wie folgt aus:

$one = Foo::select('bar as qux')->where('baz', $value); 
$two = Foo::select('baz as qux')->where('bar', $value); 

(Aus Gründen der Darstellung ist die Bedingung in meinem Beispiel überprüft, ob die Spalte $value gleich ist.)

Danach könnte ich die Ergebnisse der beiden Abfragen erhalten und sie zusammenführen. Ich möchte jedoch unter anderem einen Paginator verwenden, um eine einzige Abfrage zu erstellen.

Ich kann alle relevanten Zeilen aus der Tabelle wählen Sie diese mit:

$rows = Foo::where('baz', $value)->orWhere('bar', $value); 

Aber dann weiß ich nicht, wie bar oder baz von dort bedingt zu wählen. Es scheint, als ob die Lösung, die ich suche, eine Kombination der beiden obigen Methoden wäre.

Ist es möglich, dies in einer einzigen Abfrage mit Eloquent zu tun? Ich denke, ich kann eine rohe Abfrage ausführen, aber ich würde lieber von rohen Abfragen vollständig wegbleiben, wenn möglich. Vielen Dank.

Antwort

0

Konnten Sie nicht einfach Ihre orWhere Abfrage verwenden und nur die Ergebnisse durchgehen, um nach dem richtigen zu suchen?

$rows = Foo::where('baz', $value)->orWhere('bar', $value)->get(); 

foreach($rows as $row) { 
    $qux = ($row->bar == $value) ? $row->baz : $row->bar; 
    // do something with $qux 
} 

Wenn Sie mehr Objekt zentrisch sein wollen, können Sie die Eigenschaft qux jede Zeile Karte:

$rows = Foo::where('baz', $value)->orWhere('bar', $value) 
    ->get() 
    ->map(function($row) { 
     $row->qux = ($row->bar == $value) ? $row->baz : $row->bar; 
     return $row; 
    }); 
+0

Meine erste Antwort auf Sie zu sagen war: Ich will nicht, 'zu erhalten () 'die Ergebnisse sofort, weil ich sie paginieren möchte. Aber dann hat es mich getroffen, dass ich einfach das Ergebnis des orWhere paginieren und durchgehen kann. Danke, es sieht so aus, als würde ich es oft überdenken! – cheryllium

Verwandte Themen