Laravel Eloquent groupBy () VÀ cũng trả về số lượng của mỗi nhóm


104

Tôi có một bảng chứa, trong số các cột khác, một cột các phiên bản trình duyệt. Và tôi chỉ đơn giản là muốn biết từ bộ hồ sơ, có bao nhiêu loại trình duyệt trong mỗi loại. Vì vậy, tôi cần phải kết thúc với một cái gì đó như sau: Tổng số bản ghi: 10; Internet Explorer 8: 2; Chrome 25: 4; Firefox 20: 4. (Tất cả cộng tối đa 10)

Đây là hai xu của tôi:

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

Tất nhiên đó chỉ chứa 3 trình duyệt chứ không phải số lượng của mỗi trình duyệt. Tôi có thể làm cái này như thế nào?

Câu trả lời:


211

Điều này đang làm việc cho tôi:

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

1
Tuyệt vời! Chỉ cần thêm 'trình duyệt' vào lựa chọn do đó: select ('browser', ...) và có mọi thứ cần thiết. Bạn tốt, bạn! youtube.com/watch?v=ravi4YtUTxo
kJamesy

Cảm ơn. Nhưng tại sao nó không làm việc khi sử dụng với mô hình giống như tài khoản :: chọn ( 'nước', DB :: liệu ( 'count (*) là tổng') -> otherMethods ()?
doncadavona

1
+ v. sử dụng \ DB thay vì DB tại bộ điều khiển
Amit Bera

@AmitBera bạn có thể giải thích lý do ?, xin
JCarlosR

8
Có lý do cụ thể nào khiến bạn thích DB::table('usermetas')->..hơn Usermeta::..không?
Adam

33

Điều này phù hợp với tôi (Laravel 5.1):

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

22

Cảm ơn Antonio,

Tôi vừa thêm listslệnh vào cuối nên nó sẽ chỉ trả về một mảng có khóa và đếm:

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
Cảm ơn. Một lưu ý: -> tất cả () trong ví dụ 5.1 nên được loại bỏ, vì bạn đã liệt kê các kết quả.
Pim

1
list()bị phản đối và đổi tên thành pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
Arun Mã

12

Nếu bạn muốn lấy bộ sưu tập, hãy nhómBy và đếm:

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

Chúc mừng!


9

Hoạt động theo cách đó, gọn gàng hơn một chút. getQuery()chỉ trả về trình tạo cơ bản, đã chứa tham chiếu bảng.

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

5
  1. Mở config/database.php
  2. Tìm strictchìa khóa bên trong mysqlcài đặt kết nối
  3. Đặt giá trị thành false

1

Hãy thử với cái này

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

2
Mặc dù điều này có thể trả lời câu hỏi, nhưng tốt hơn là giải thích các phần thiết yếu của câu trả lời và có thể là vấn đề với mã OPs là gì.
pirho

1

Đây là một cách Laravel khác để xử lý nhóm theo nhóm mà không cần sử dụng các câu lệnh thô.

$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
Đây là bộ nhớ và xử lý đói.
doncadavona

Cùng một bộ nhớ pb cho tôi
Vince

0

Nếu bạn muốn nhận dữ liệu được sắp xếp, hãy sử dụng

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

Đây là một ví dụ về số lượng kết quả của bài đăng theo danh mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.