Laravel Eloquent grubuBy () ile VE ayrıca her grubun sayısını döndürür


114

Diğer sütunların yanı sıra tarayıcı sürümlerinin bir sütununu içeren bir tablom var. Ve ben sadece kayıt setinden, her türden tarayıcıdan kaç tane olduğunu bilmek istiyorum. Bu yüzden, şuna benzer bir şey bulmam gerekiyor: Toplam Kayıt: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Tümü 10'a kadar eklenir)

İşte benim iki pensim:

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

Tabii ki bu sadece 3 tarayıcıyı içerir, her birinin numarasını değil. Bunu nasıl yapabilirim?

Yanıtlar:


223

Bu benim için çalışıyor:

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

1
Muhteşem! Seçime sadece 'tarayıcı' eklendi: seçin ('tarayıcı', ...) ve gereken her şeyi aldı. İyisin sen! youtube.com/watch?v=ravi4YtUTxo
kJamesy

Teşekkürler. Ancak User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona

1
+ v. denetleyicilerde DB yerine \ DB kullan
Amit Bera

@AmitBera nedenini açıklar mısınız ?, lütfen
JCarlosR

8
Tercih neden belirli bir nedeni var mı DB::table('usermetas')->..üzerinde Usermeta::..?
Adam

35

Bu benim için çalışıyor (Laravel 5.1):

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

23

Teşekkürler Antonio,

listsKomutu sonuna ekledim, böylece key ve count ile yalnızca bir dizi döndürecektir:

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
Teşekkürler. Bir not: -> 5.1 örneğindeki tümü () kaldırılmalıdır, çünkü sonuçları zaten listeliyorsunuz.
Pim

1
list()kullanımdan kaldırıldı ve pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0 olarak
Arun Kodu

14

Collection, groupBy ve count almak istiyorsanız:

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

Şerefe!


9

Bu şekilde de çalışır, biraz daha derli toplu. getQuery()yalnızca tablo referansını içeren temel oluşturucuyu döndürür.

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

5
  1. Açık config/database.php
  2. Bağlantı ayarlarının strictiçindeki anahtarı bulunmysql
  3. Değeri şu şekilde ayarlayın: false

1

Bununla dene

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

2
Bu soruya cevap verebilirken, cevabın temel kısımlarını ve muhtemelen OP koduyla ilgili sorunun ne olduğunu açıklamak daha iyidir.
pirho

1

İşte ham ifadeleri kullanmaya gerek kalmadan grubu ele almanın daha Laravel yolu.

$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
Bu hafıza ve işlemeye aç.
doncadavona

Benim için aynı hafıza pb
Vince

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

Bu, kategoriye göre gönderi sayımıyla sonuçlanan bir örnektir.


0

Sıralanmış verileri almak istiyorsanız bunu da kullanın

$category_id = Post::orderBy('count', 'desc')
                     ->select(DB::raw('category_id,count(*) as count'))
                     ->groupBy('category_id')
                     ->get();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.