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ć?

Odpowiedzi:


217

To działa dla mnie:

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

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

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

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!


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

5
  1. otwarty config/database.php
  2. Znajdź strictklucz w mysqlustawieniach połączenia
  3. Ustaw wartość na false

1

Spróbuj z tym

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

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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.