Laravel Eloquent groupBy () AND gibt auch die Anzahl jeder Gruppe zurück

104

Ich habe eine Tabelle, die unter anderem eine Spalte mit Browserversionen enthält. Und ich möchte einfach aus dem Datensatz wissen, wie viele von jedem Browsertyp es gibt. Also muss ich am Ende so etwas haben: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Alles zusammen 10)

Hier sind meine zwei Pence:

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

Das enthält natürlich nur die 3 Browser und nicht die Nummer von jedem. Wie kann ich das machen?

kJamesy
quelle

Antworten:

210

Das funktioniert bei mir:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
quelle
1
Hervorragend! Fügen Sie der Auswahl einfach 'Browser' hinzu: Wählen Sie ('Browser', ...) und Sie haben alles Notwendige. Du bist gut, du! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Vielen Dank. Aber warum funktioniert es nicht, wenn es mit Modellen wie User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods () verwendet wird?
doncadavona
1
+ v. Verwenden Sie \ DB anstelle von DB bei Controllern
Amit Bera
@AmitBera können Sie den Grund erklären?, Bitte
JCarlosR
7
Gibt es einen besonderen Grund , warum Sie es vorziehen , DB::table('usermetas')->..über Usermeta::..?
Adam
33

Das funktioniert bei mir (Laravel 5.1):

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

Danke Antonio,

Ich habe gerade den listsBefehl am Ende hinzugefügt, damit nur ein Array mit Schlüssel und Anzahl zurückgegeben wird:

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();
Diogo Gomes
quelle
1
Vielen Dank. Ein Hinweis: -> all () im 5.1-Beispiel sollte entfernt werden, da Sie die Ergebnisse bereits auflisten.
Pim
1
list()ist veraltet und wird in pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Code
12

Wenn Sie eine Sammlung erhalten möchten, gruppieren Sie und zählen Sie:

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

Prost!

Adam Kozlowski
quelle
9

Funktioniert auch so, etwas ordentlicher. getQuery()Gibt nur den zugrunde liegenden Builder zurück, der bereits die Tabellenreferenz enthält.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
quelle
5
  1. Öffnen config/database.php
  2. Suchen Sie den strictSchlüssel in den mysqlVerbindungseinstellungen
  3. Stellen Sie den Wert auf ein false
Boris Tetřev
quelle
1

Versuchen Sie es damit

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
quelle
2
Während dies die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort und möglicherweise das Problem mit dem OP-Code zu erklären.
Pirho
1

Hier finden Sie eine Laravel-Methode zum Behandeln von Gruppen, ohne dass rohe Anweisungen verwendet werden müssen.

$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();
}
Vulfoliac
quelle
7
Dies ist Speicher und Verarbeitung hungrig.
Doncadavona
Gleiche Erinnerung pb für mich
Vince
0

Wenn Sie sortierte Daten erhalten möchten, verwenden Sie diese ebenfalls

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

Dies ist ein Beispiel, bei dem die Anzahl der Beiträge nach Kategorien ermittelt wird.

Yuvraj Hinger
quelle