2016-09-06 2 views
1

angeben ich eine where-Klausel:Schleife eine Where-Klausel?

$this->model = $model->where('published', '=', '1'); 
$this->model->get(); 

Die obige funktioniert gut, eine Abfrage Protokoll geben: eine Schleife durch, wo Klauseln aus einem Array

select * from `products` where `published` = ?" 

Aber ich brauche.

$arr = [['published', '=', '1'], ['id', '=', '1']]; 
foreach ($arr as $key => $value) { 
    $model = $model->where($value); 
} 
$model->get(); 

Aber mit dem oben genannten bekomme ich eine Spalte nicht gefunden. Unbekannte Spalte '0' in 'Where-Klausel'.

Wohin gehe ich falsch?

Anschluss an diese, wenn ich in das gesamte Feld übergeben Sie einfach, es funktioniert:

$model = $model->where($arr); 

Geben Sie eine Abfrage Protokoll:

"select * from `products` where (`published` = ? and `id` = ?)" 

Aber die where-Klauseln sind in Klammern ... Warum?

+0

Wäre es richtig zu denken, dass Sie die Werte im Array an Ihr 'wo' übergeben wollen? Wenn Sie zum Beispiel '[['col', '=', 'val']]' 'hätten, würde das zu' $ model-> wo ('col', '=', 'val') '? – Jonathon

+0

Ja, das ist korrekt, und das kann ich schon mit $ model-> where ($ arr); aber das Problem ist, dass es Klammern um meine WHERE-Klausel verursacht. Warum macht es das und was bedeuten die Klammern? – panthro

+0

Versuchen Sie, die Zuweisung zu entfernen, also '$ model = $ model-> wobei (...);' $ modell-> where (...); '. Macht das irgendwas? Sie erhalten oft Klammern um where-Klauseln, wenn Sie etwas tun wie $ modell-> wo (funktion ($ query) {// Extra where-Klauseln}); ' – Jonathon

Antwort

0

Ich denke, dass Sie den Spaltennamen vermissen.
Versuchen Sie folgendes:

foreach ($arr as $key => $value) { 
    $model = $model->where($value[0],$value[1],$value[2]); 
} 
+0

Es ist kein assoziatives Array. – panthro

+0

@panthro Entschuldigung habe ich nicht bemerkt. Aber, da der '$ value' selbst ein Array ist, wird das obige Update tun? – jaysingkar

+0

Was passiert, wenn das Array nicht 3 Werte hat? – panthro

2

Ich habe es geschafft, nur etwas zum Laufen zu bringen:

\DB::enableQueryLog(); 

$model = (new User)->newQuery(); 

$wheres = [ 
    ['forename', '=', 'Joe'], 
    ['surname', '=', 'Bloggs'], 
    ['email', '=', '[email protected]'] 
]; 

foreach ($wheres as $where) { 
    // Call $model->where(...) passing in each array item as a separate param 
    call_user_func_array([$model, 'where'], $where); 
} 

$result = $model->get(); 

dd(\DB::getQueryLog(), $result); 

Diese in der Abfrage-Ergebnisse:

select * from `users` where `forename` = ? and `surname` = ? and `email` = ? 

Der Trick schien die ->newQuery() Zugabe zu Teil beim Erstellen einer Instanz des Modells, auf dem die Abfrage ausgeführt werden soll.

Hinweis, die call_user_func_array Übergabe jedes Element des Arrays zu $model->where(...). Ich habe festgestellt, dass die Übergabe eines Arrays an ->where(...) dazu führt, dass der Builder versucht, mehrere where Klauseln hinzuzufügen. Ein weiterer Vorteil der Verwendung von call_user_func_array ist auch, dass es jedoch viele Parameter übergeben werden Sie in jeder Klausel zur Verfügung stellen wollen - muss nicht exakt 3.

2

Lösung 1

$query = new Model; 

foreach($arr as $condition){ 
    $query->where($condition[0], $condition[1], $condition[2]); 
} 

$query->get(); 

Dies ist eine Abfrage erstellen wie die folgenden

Select * from table where published = 1 and id = 1; 

Hier können Sie sehen, dass die Werte nicht in Klammern sind, da sie kein kombiniertes Ergebnis sind. 2

Lösung

Diese Lösung wird eine kombinierte für schaffen, in dem Klauseln und das Endergebnis in Klammern werden

$query = new Model; 
$query->where(function($q) use ($arr){ 
    foreach($arr as $condition){ 
     $q->where($condition[0], $condition[1], $condition[2]); 
    } 
} 

$query->get(); 

Diese genaue Abfrage führen wird, die Sie erreicht haben.Dies liegt daran, die Lösung Zusammenbruch ist das, was in Ihrer Abfrage geschieht $ this-> modell-> where ($ arr)

Select * from table where (published = 1 and id = 1); 

HINWEIS

wissen Um weiter, warum dies ist unter der folgenden geschehen aussehen

Beispiel
Select * from table where (id = 2 or product_id = 3) and (publish = 1 and status = 2) 

Mit dieser Abfrage können Sie sehen, dass es eine Mischung aus Lösung 1 und Lösung 2. lösen Sie es

ist

Bis jetzt haben wir das folgende Ergebnis

Select * from table where (id = 1 or id = 2) 
erstellt haben

nun den nächsten Teil der Abfrage folgenden wir die mit diesem

//continued from above 
//$query has the above condition which can be continued after the first where for chaining or in next line. 
$query->where(function($q) use($input){ 
    $q->where('publish' ,'=', 1)->where('status','=',1); 
} 

Nun wird die letzte Abfrage derjenige, hinzufügen wir erforderlich. Hoffe jetzt ist klar, warum Klammern hinzugefügt wurden.

+0

Danke, nur eine kurze Frage, was machen Klammern tatsächlich um Teile der Where-Klausel? – panthro

+0

Dies ist genau wie BODMAS (Klammern dann aus dann Division dann Multiplikation dann Addition dann Subtraktion). Der Inhalt der Klammern wird zuerst berechnet, dann wird das Ergebnis für den endgültigen Vergleich verwendet. Aufschlüsselung ** Wählen Sie * aus der Tabelle, wo (Bedingungen) und (Bedingungen) > Wählen Sie * aus der Tabelle wahr und wahr; ** –