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?

Antworten:


210

Das funktioniert bei mir:

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

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();

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();

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!


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');

5
  1. Öffnen config/database.php
  2. Suchen Sie den strictSchlüssel in den mysqlVerbindungseinstellungen
  3. Stellen Sie den Wert auf ein false

1

Versuchen Sie es damit

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

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

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();

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.