Отдельное условие where для каждого выбранного количества в laravel - PullRequest
1 голос
/ 13 июля 2020

В laravel Я пытаюсь получить несколько подсчетов, например

      $records=DB::table('my_table')
             ->select(DB::raw('COUNT(id) as record_count'),DB::raw('COUNT(id) as record_count_1 where status="done"'),DB::raw('COUNT(id) as record_count_2 where status="failed"'))
             ->where('record_date','>=','2020-07-12')
             ->where('sent_at','<=','2020-07-13')
             ->get();

, чтобы я мог получить связанные значения как

     pr($records[0]->record_count);
     pr($records[0]->record_count_1);
     pr($records[0]->record_count_2);

Но есть синтаксическая ошибка. Как я могу сделать это в рамках laravel? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

я думаю, что вам следует использовать Подзапросы

 $countDoneStatus=DB::table('my_table')->selectRaw('id,COUNT(id) as done_status_count ')
        ->where('record_date','>=','2020-07-12')
        ->where('status','done')
        ->where('sent_at','<=','2020-07-13');

    $countFailedStatus=DB::table('my_table')->selectRaw('my_table.id,COUNT(id) as failed_status_count')
        ->where('status','failed')
        ->where('record_date','>=','2020-07-12')
        ->where('sent_at','<=','2020-07-13');

    $records=DB::table('my_table')->joinSub($countDoneStatus,'countDoneStatus',function($join){
        $join->on('my_table.id', '=', 'countDoneStatus.id');
    })->joinSub($countFailedStatus,'countFailedStatus',function($join){
        $join->on('my_table.id', '=', 'countFailedStatus.id');
    })
        ->selectRaw('COUNT(my_table.id) as record_count,countFailedStatus.failed_status_count,countDoneStatus.done_status_count')
        ->where('record_date','>=','2020-07-12')
        ->where('sent_at','<=','2020-07-13')
        ->get();
0 голосов
/ 13 июля 2020

Использовать условное агрегирование:

$records = DB::table('my_table')
    ->select(DB::raw("COUNT(id) AS record_count"),
             DB::raw("SUM(status = 'done') AS record_count_1"),
             DB::raw("SUM(status = 'failed') AS record_count_2"))
    ->where('record_date','>=','2020-07-12')
    ->where('sent_at','<=','2020-07-13')
    ->get();
...