Есть ли способ вернуть 0 для месяцев без данных? - PullRequest
2 голосов
/ 11 июля 2020

Я использую Chart. js, чтобы показать общее количество транзакций (количество) за каждый месяц.

$dataTotal = ModelName::select(DB::raw('count(id) as count'), DB::raw("MONTH(created_at)  as month")) 
                        ->where('org_id', auth()->user()->org_id)
                        ->where('result_code', 200)
                        ->groupBy('month')
                        ->orderBy('month')
                        ->get()
                        ->toArray();

Сам запрос в порядке, за исключением проблемы, что если нет записей в месяц, то он не возвращает 0 за этот месяц. Это приводит к тому, что график не отображается должным образом.

Есть ли у кого-нибудь предложения, как я могу его реализовать, чтобы получать полные наборы результатов?

Желаемый формат:

array (
0 => 
array (
  'count' => 0,
  'month' => 1,
),
1 => 
array (
  'count' => 5,
  'month' => 2,
),
2 => 
array (
  'count' => 0,
  'month' => 3,
),
3 => 
array (
  'count' => 4,
  'month' => 4,
),
4 => 
array (
  'count' => 0,
  'month' => 5,
),
5 => 
array (
  'count' => 4,
  'month' => 6,
),
6 => 
array (
  'count' => 51225,
  'month' => 7,
),
7 => 
array (
  'count' => 4,
  'month' => 8,
),
8 => 
array (
  'count' => 0,
  'month' => 9,
),
9 => 
array (
  'count' => 0,
  'month' => 10,
),
10 => 
array (
  'count' => 0,
  'month' => 11,
),
11 => 
array (
  'count' => 0,
  'month' => 12,
),

)  

1 Ответ

2 голосов
/ 11 июля 2020
$monthlyArray = array();
$emptyMonth = array('count' => 0, 'month' => 0);
for($i = 1; $i <= 12; $i++){//generate an array with default values
    $emptyMonth['month'] = $i;
    $monthlyArray[$i-1] = $emptyMonth;

}

$dataTotal = ModelName::select(DB::raw('count(id) as count'), DB::raw("MONTH(created_at)  as month")) 
                        ->where('org_id', auth()->user()->org_id)
                        ->where('result_code', 200)
                        ->groupBy('month')
                        ->orderBy('month')// you don't really need this one 
                        ->get()
                        ->toArray();//fetch the results

foreach($dataTotal as $key => $array){//add the results to the default array
    $monthlyArray[$array['month']-1] = $array;
}
//monthlyArray contains the data
...