Laravel Eloquent groupBy () ORAZ również zwraca liczbę każdej grupy

110

Mam tabelę zawierającą, między innymi, kolumnę wersji przeglądarek. Chcę po prostu dowiedzieć się z zestawu rekordów, ile jest przeglądarek każdego typu. Więc muszę skończyć z czymś takim: Total Records: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4 (wszystko w sumie do 10)

Oto moje dwa pensy:

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

Oczywiście zawiera tylko 3 przeglądarki, a nie ich liczbę. W jaki sposób mogę to zrobić?

kJamesy
źródło

Odpowiedzi:

217

To działa dla mnie:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
źródło
1
Wspaniały! Właśnie dodałem „przeglądarkę” do zaznaczenia: wybierz („przeglądarka”, ...) i otrzymałem wszystko, co potrzebne. Jesteś dobry, ty! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Dzięki. Ale dlaczego nie działa, gdy jest używany z modelami takimi jak User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona
1
+ v. użyj \ DB zamiast DB na kontrolerach
Amit Bera
@AmitBera czy możesz wyjaśnić powód ?, proszę
JCarlosR
8
Czy jest jakiś szczególny powód, dlaczego wolisz DB::table('usermetas')->..nad Usermeta::..?
Adam
34

To działa dla mnie (Laravel 5.1):

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();
carlituxman
źródło
22

Dzięki Antonio,

Właśnie dodałem listspolecenie na końcu, więc zwróci tylko jedną tablicę z kluczem i liczbą:

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
źródło
1
Dzięki. Jedna uwaga: -> all () w przykładzie 5.1 powinno zostać usunięte, ponieważ wyniki są już wymienione.
Pim
1
list()jest przestarzały i zmieniono jego nazwę na pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Kod Arun
13

Jeśli chcesz otrzymać kolekcję, grupuj i policz:

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

Twoje zdrowie!

Adam Kozłowski
źródło
9

Działa również w ten sposób, trochę bardziej uporządkowany. getQuery()po prostu zwraca bazowy konstruktor, który już zawiera odwołanie do tabeli.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
źródło
5
  1. otwarty config/database.php
  2. Znajdź strictklucz w mysqlustawieniach połączenia
  3. Ustaw wartość na false
Boris Tetřev
źródło
1

Spróbuj z tym

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
źródło
2
Chociaż może to odpowiedzieć na pytanie, lepiej jest wyjaśnić podstawowe części odpowiedzi i być może na czym polegał problem z kodem PO.
pirho
1

Oto bardziej Laravelowy sposób obsługi grupowania bez potrzeby używania surowych instrukcji.

$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
źródło
8
To głód pamięci i przetwarzania.
doncadavona
To samo pb pamięci dla mnie
Vince
0

Jeśli chcesz uzyskać posortowane dane, użyj tego również

$category_id = Post::orderBy('count', 'desc')->select(DB::raw('category_id,count(*) as count'))->groupBy('category_id')->get();
Yuvraj Hinger
źródło
0
$post = Post::select(DB::raw('count(*) as user_count, category_id'))->groupBy('category_id')->get();

To jest przykład, w którym wyniki liczą posty według kategorii.

Yuvraj Hinger
źródło