2014-04-20 23 views
13

Come fare il GROUP BY più colonne in Laravel? Ho provato questo codice:Raggruppamento per colonne multiple in Laravel

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

Ma questo non sta funzionando.

+0

funziona per me, hai trovato il tuo problema? –

risposta

23

Hai provato:

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

non puo 'controllare qui adesso, ma l'API dice groupBy() accetta un array.

Per riferimento, si prega di visitare:

+0

Anche questo non funziona. Mostrando l'errore come segue. ** ErrorException ** strtolower() si aspetta che il parametro 1 sia stringa, matrice data – satjan

+0

Ouch. Mi dispiace satjan. Lasciami tornare a casa e ti darò un test per te. –

+0

@satjan puoi provare con la risposta modificata? –

6

Non è corretto credere che il Database \ Query \ Builder :: groupBy() il metodo accetta gli array come argomenti. Attualmente accetta solo il numero N di argomenti stringa.

momento in cui scriviamo, l'attuale versione del quadro laravel è: v4.2.4, e il codice per il Database \ metodo di query \ Builder :: groupBy() è il seguente:

/** 
* 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; 
} 

Se ci pensi, func_get_args() restituisce una matrice di tutte le colonne che potrebbero essere state inserite come stringhe. Pertanto, atteso ingresso di questa funzione è:

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

La risultante struttura $ this-> gruppi sull'oggetto builder dovrebbe essere un array di stringhe, in questo modo:

['column1','column2'] 

Tuttavia, se nutriti una matrice nel metodo di cui sopra, in questo modo:

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

la proprietà $ this-> gruppi sarebbe finire con un array nidificato che assomiglia a questo:

[['column1','column2']] 

Il resto del framework del generatore di query si aspetta che la proprietà $ builder-> groups sia una matrice di stringhe non annidata. Pertanto, quando il framework tenta di raggruppare e racchiudere i nomi delle tabelle nel proprio formato di escape (ogni motore di database ha un operatore di escape diverso), prova a racchiudere una matrice invece di una stringa e si ottiene il proprio errore.

La riga di errore offendente è la riga 49 in Database \ Grammar :: wrap().

Se dovessimo modificare il database \ Query \ Builder :: groupBy() per renderlo accettare array, ci sarebbe riscriverla qualcosa di simile al seguente:

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; 
} 

Questo metodo accetta un array in qualsiasi indice dei parametri.

+0

Una richiesta pull è stata inviata al team di Laravel per risolvere questo problema. Vedi: https://github.com/laravel/framework/pull/4843 –

+0

La capacità di passare un array a groupBy() è stata aggiunta in L4.2. Vedere https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Query/Builder.php#L1017 come riferimento. –

Problemi correlati