Laravel Eloquent groupBy () AND juga mengembalikan hitungan tiap grup

105

Saya memiliki tabel yang berisi, di antara kolom lain, kolom versi browser. Dan saya hanya ingin tahu dari kumpulan rekor, berapa banyak dari setiap jenis browser yang ada. Jadi, saya harus mengakhiri dengan sesuatu seperti ini: Total Records: 10; Internet Explorer 8: 2; Krom 25: 4; Firefox 20: 4. (Semua menambahkan hingga 10)

Ini dua pence saya:

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

Tentu saja itu hanya berisi 3 browser dan bukan nomor masing-masing. Bagaimana saya bisa melakukan ini?

kJamesy
sumber

Jawaban:

212

Ini berhasil untuk saya:

$user_info = DB::table('usermetas')
                 ->select('browser', DB::raw('count(*) as total'))
                 ->groupBy('browser')
                 ->get();
Antonio Carlos Ribeiro
sumber
1
Hebat! Baru saja menambahkan 'browser' ke pilihan sebagai berikut: pilih ('browser', ...) dan dapatkan semua yang dibutuhkan. Anda baik, Anda! youtube.com/watch?v=ravi4YtUTxo
kJamesy
Terima kasih. Tetapi mengapa tidak berfungsi saat digunakan dengan Model seperti User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona
1
+ v. gunakan \ DB daripada DB di pengontrol
Amit Bera
@AmitBera dapatkah Anda menjelaskan alasannya ?, tolong
JCarlosR
8
Apakah ada alasan tertentu mengapa Anda lebih suka DB::table('usermetas')->..lebih Usermeta::..?
Adam
33

Ini berfungsi untuk saya (Laravel 5.1):

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

Terima kasih Antonio,

Saya baru saja menambahkan listsperintah di bagian akhir sehingga hanya akan mengembalikan satu array dengan kunci dan hitungan:

Laravel 4

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

Laravel 5.1.0

$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
sumber
1
Terima kasih. Satu catatan: -> all () dalam contoh 5.1 harus dihapus, karena Anda sudah mencantumkan hasilnya.
Pim
1
list()tidak digunakan lagi dan diganti namanya menjadi pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Code
12

Jika Anda ingin mendapatkan collection, groupBy dan count:

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

Bersulang!

Adam Kozlowski
sumber
9

Bekerja seperti itu juga, sedikit lebih rapi. getQuery()hanya mengembalikan pembuat yang mendasari, yang sudah berisi referensi tabel.

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
                     ->select('browser', $browser_total_raw)
                     ->groupBy('browser')
                     ->pluck('total','browser');
Yauheni Prakopchyk
sumber
5
  1. Buka config/database.php
  2. Temukan strictkunci di dalam mysqlpengaturan koneksi
  3. Setel nilainya menjadi false
Boris Tetřev
sumber
1

Coba dengan ini

->groupBy('state_id','locality')
  ->havingRaw('count > 1 ')
  ->having('items.name','LIKE',"%$keyword%")
  ->orHavingRaw('brand LIKE ?',array("%$keyword%"))
Jasim Juwel
sumber
2
Meskipun ini mungkin menjawab pertanyaan, lebih baik menjelaskan bagian penting dari jawaban dan mungkin apa masalah dengan kode OPs.
pirho
1

Berikut adalah cara yang lebih Laravel untuk menangani grup tanpa perlu menggunakan pernyataan mentah.

$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
sumber
7
Ini adalah memori dan pemrosesan yang lapar.
doncadavona
Pb memori yang sama untuk saya
Vince
0

Jika Anda ingin mendapatkan data yang diurutkan, gunakan ini juga

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

Ini adalah contoh hasil hitungan posting berdasarkan kategori.

Yuvraj Hinger
sumber