Laravel Eloquent groupBy () E restituisce anche il conteggio di ciascun gruppo


105

Ho una tabella che contiene, tra le altre colonne, una colonna delle versioni del browser. E voglio semplicemente sapere dal set di record quanti di ogni tipo di browser ci sono. Quindi, ho bisogno di finire con qualcosa del genere: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Tutti sommando fino a 10)

Ecco i miei due pence:

$user_info = Usermeta::groupBy('browser')->get();

Ovviamente questo contiene solo i 3 browser e non il numero di ciascuno. Come posso fare questo?

Risposte:


212

Questo funziona per me:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();

1
Stupendo! Ho appena aggiunto 'browser' alla selezione così: seleziona ('browser', ...) e hai tutto il necessario. Sei bravo, tu! youtube.com/watch?v=ravi4YtUTxo
kJamesy

Grazie. Ma perché non funziona se usato con modelli come User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona

1
+ v. usa \ DB invece di DB nei controller
Amit Bera

@AmitBera puoi spiegare il motivo ?, per favore
JCarlosR

8
C'è un motivo particolare per cui si preferisce DB::table('usermetas')->..sopra Usermeta::..?
Adam

33

Questo funziona per me (Laravel 5.1):

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();

22

Grazie Antonio,

Ho appena aggiunto il listscomando alla fine, quindi restituirà solo un array con chiave e conteggio:

Laravel 4

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser');

Laravel 5.1

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->lists('total','browser')->all();

Laravel 5.2+

$user_info = DB::table('usermetas')
             ->select('browser', DB::raw('count(*) as total'))
             ->groupBy('browser')
             ->pluck('total','browser')->all();

1
Grazie. Una nota: -> all () nell'esempio 5.1 dovrebbe essere rimosso, poiché elenca già i risultati.
Pim

1
list()è deprecato e rinominato in pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Codice Arun

12

Se vuoi ottenere la raccolta, groupBy e contare:

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

Saluti!


9

Funziona anche in questo modo, un po 'più ordinato. getQuery()restituisce solo il builder sottostante, che contiene già il riferimento alla tabella.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');

5
  1. Aperto config/database.php
  2. Trova la strictchiave nelle mysqlimpostazioni di connessione
  3. Imposta il valore su false

1

Prova con questo

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))

2
Sebbene questo possa rispondere alla domanda, è meglio spiegare le parti essenziali della risposta e possibilmente qual era il problema con il codice OP.
pirho

1

Ecco un modo più Laravel per gestire il gruppo senza la necessità di utilizzare istruzioni non elaborate.

$sources = $sources->where('age','>', 31)->groupBy('age');

$output = null;
foreach($sources as $key => $source) {
    foreach($source as $item) {
        //get each item in the group
    }
    $output[$key] = $source->count();
}

7
Questa è affamata di memoria e di elaborazione.
doncadavona

Stessa memoria per me
Vince

0

Se vuoi ottenere dati ordinati usa anche questo

$category_id = Post::orderBy('count', 'desc')->select(DB::raw('category_id,count(*) as count'))->groupBy('category_id')->get();

0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))->groupBy('category_id')->get();

Questo è un esempio in cui i risultati contano dei post per categoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.