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?

Jawaban:


212

Ini berhasil untuk saya:

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

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

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

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!


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

5
  1. Buka config/database.php
  2. Temukan strictkunci di dalam mysqlpengaturan koneksi
  3. Setel nilainya menjadi false

1

Coba dengan ini

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

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

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

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

Ini adalah contoh hasil hitungan posting berdasarkan kategori.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.