Laravel Eloquent groupBy () และยังส่งคืนจำนวนของแต่ละกลุ่ม


114

ฉันมีตารางที่ประกอบด้วยคอลัมน์ของเวอร์ชันเบราว์เซอร์ และฉันต้องการทราบจากชุดบันทึกว่ามีเบราว์เซอร์กี่ประเภท ดังนั้นฉันต้องจบลงด้วยสิ่งนี้: Total Records: 10; Internet Explorer 8: 2; โครม 25: 4; Firefox 20: 4 (เพิ่มได้สูงสุด 10 ตัว)

นี่คือสองเพนนีของฉัน:

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

แน่นอนว่ามีเพียง 3 เบราว์เซอร์ไม่ใช่จำนวนของแต่ละเบราว์เซอร์ ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


223

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

1
สุดยอด! เพิ่งเพิ่ม 'เบราว์เซอร์' ในการเลือกดังนี้: เลือก ('เบราว์เซอร์', ... ) และมีทุกสิ่งที่จำเป็น คุณดีคุณ! youtube.com/watch?v=ravi4YtUTxo
kJamesy

ขอบคุณ. แต่ทำไมถึงไม่ได้ผลเมื่อใช้กับโมเดลเช่น User :: select ('country', DB :: raw ('count (*) as total') -> otherMethods ()?
doncadavona

1
+ v. ใช้ \ DB แทน DB ที่คอนโทรลเลอร์
Amit Bera

@AmitBera คุณช่วยอธิบายเหตุผลได้ไหมโปรด
JCarlosR

8
มีเหตุผลอะไรเป็นพิเศษไหมที่คุณชอบDB::table('usermetas')->..มากกว่าUsermeta::..?
Adam

35

สิ่งนี้ใช้ได้กับฉัน (Laravel 5.1):

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

23

ขอบคุณอันโตนิโอ

ฉันเพิ่งเพิ่มlistsคำสั่งในตอนท้ายดังนั้นมันจะส่งคืนอาร์เรย์เพียงหนึ่งรายการพร้อมคีย์และนับ:

ลาราเวล 4

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

ลาราเวล 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
ขอบคุณ. หมายเหตุหนึ่ง: -> ทั้งหมด () ในตัวอย่าง 5.1 ควรถูกลบออกเนื่องจากคุณแสดงรายการผลลัพธ์แล้ว
พิมพ์

1
list()เลิกใช้แล้วและเปลี่ยนชื่อเป็นpluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
รหัสอรุณ

14

หากคุณต้องการรับคอลเลกชัน groupBy และนับ:

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

ไชโย!


9

ได้ผลเช่นกันเป็นระเบียบเรียบร้อยมากขึ้น getQuery()เพียงแค่ส่งคืนตัวสร้างพื้นฐานซึ่งมีการอ้างอิงตารางอยู่แล้ว

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

5
  1. เปิด config/database.php
  2. ค้นหาstrictคีย์ภายในmysqlการตั้งค่าการเชื่อมต่อ
  3. ตั้งค่าเป็น false

1

ลองกับสิ่งนี้

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

2
แม้ว่าสิ่งนี้อาจตอบคำถามได้ แต่จะเป็นการดีกว่าที่จะอธิบายส่วนสำคัญของคำตอบและอาจเป็นปัญหาเกี่ยวกับรหัส OPs
pirho

1

นี่คือวิธี Laravel เพิ่มเติมในการจัดการกลุ่มโดยไม่จำเป็นต้องใช้คำสั่งดิบ

$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
นี่คือความจำและการประมวลผลหิว
doncadavona

pb หน่วยความจำเดียวกันสำหรับฉัน
Vince

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

นี่คือตัวอย่างผลการนับโพสต์ตามหมวดหมู่


0

หากคุณต้องการรับข้อมูลที่จัดเรียงให้ใช้สิ่งนี้ด้วย

$category_id = Post::orderBy('count', 'desc')
                     ->select(DB::raw('category_id,count(*) as count'))
                     ->groupBy('category_id')
                     ->get();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.