2014-04-20 15 views
13

Wie zu GROUP BY mehrere Spalte in Laravel? Ich habe versucht, diesen Code:Gruppe von mehreren Spalten in Laravel

$routes = DB::table('route') 
    ->groupBy('rte_origin') 
    ->groupBy('rte_destination') 
    ->get(); 

Aber das funktioniert nicht.

+0

es funktioniert für mich, haben Sie Ihr Problem gefunden? –

Antwort

23

Haben Sie versucht:

$routes = DB::table('route') 
->groupBy('rte_origin', 'rte_destination') 
->get(); 

nicht hier jetzt testen können, aber die API sagt groupBy() akzeptiert ein Array.

Als Referenz finden Sie unter:

+0

Das funktioniert auch nicht. Fehler wie folgt angezeigt. ** ErrorException ** strtolower() erwartet Parameter 1 als String, Array als gegeben – satjan

+0

Autsch. Tut mir leid, Satjan. Lass mich nach Hause kommen und ich werde das für dich testen. –

+0

@satjan können Sie bitte mit der bearbeiteten Antwort versuchen? –

6

Es ist falsch zu glauben, dass die Datenbank \ query \ Builder :: groupBy() Methode akzeptiert Arrays als Argumente. Zur Zeit akzeptiert es nur eine Anzahl von String-Argumenten.

Zum Zeitpunkt des Schreibens, die aktuelle Version des Laravel Framework ist: V4.2.4, und der Code für die Datenbank \ query \ Builder :: groupBy() Methode ist wie folgt:

/** 
* Add a "group by" clause to the query. 
* 
* @param dynamic $columns 
* @return \Illuminate\Database\Query\Builder|static 
*/ 
public function groupBy() 
{ 
    $this->groups = array_merge((array) $this->groups, func_get_args()); 

    return $this; 
} 

Wenn Wenn Sie darüber nachdenken, gibt func_get_args() ein Array aller Spalten zurück, die möglicherweise als Strings eingegeben wurden. Daher dieser Funktion erwartet Eingang:

$builder->groupBy('column1', 'column2', ...); 

Die resultierende $ this-> Gruppen-Eigenschaft auf dem Builder-Objekt sollte ein Array von Strings sein, wie folgt aus:

['column1','column2'] 

Wenn wir jedoch gefüttert ein Array in das Verfahren oben, wie folgt aus:

$builder->groupBy(['column1','column2']); 

die $ this-> Gruppen Eigenschaft würde mit einem verschachtelten Array am Ende, das wie folgt aussieht:

Der Rest des Query Builder-Frameworks erwartet, dass die $ builder-> groups-Eigenschaft ein nicht verschachteltes Array von Zeichenfolgen ist. Wenn das Framework versucht, Tabellennamen in ihrem richtigen Escape-Format zu spalten und zu umbrechen (jede Datenbank-Engine hat einen anderen Escape-Operator für Tabellennamen), versucht es daher, ein Array anstelle einer Zeichenfolge zu umbrechen, und Sie erhalten den Fehler.

Die fehlerhafte Fehlerzeile ist Zeile 49 in Database \ Grammar :: wrap().

Wenn wir die Datenbank \ query \ Builder ändern waren :: groupBy() -Methode, um es Arrays machen akzeptieren, würden wir es so etwas wie die folgenden umschreiben:

public function groupBy() 
{ 
    $args = func_get_args(); 
    foreach($args AS $arg) 
    { 
     $arg = (is_array($arg)) ? $arg:[$arg]; 
     $this->groups = array_merge((array) $this->groups, $arg); 
    } 

    return $this; 
} 

Diese Methode ein Array an jeder akzeptiert Parameterindex.

+0

Eine Pull-Anfrage wurde an das Laravel-Team gesendet, um dieses Problem zu beheben. Siehe: https://github.com/laravel/framework/pull/4843 –

+0

Die Möglichkeit, ein Array an groupBy() zu übergeben, wurde in L4.2 hinzugefügt. Siehe https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Query/Builder.php#L1017 als Referenz. –