Возвращает 0 как данные за месяцы без данных - PullRequest
0 голосов
/ 10 июля 2020

Я использую диаграмму. 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,
),

)

Ответы [ 2 ]

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

Хотя лично мной не проверено, а по документации. В вашей модели вы можете выполнить приведение атрибутов .

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ModelName extends Model
{
    
    protected $casts = [
        'count' => 'integer',
    ];
}

Итак, теперь атрибут count всегда будет преобразован в целое число, когда вы обращаетесь к нему, даже если базовое значение хранится в база данных как null. Также мы знаем, что если мы преобразуем нулевое значение в целое число, оно вернет 0. Например, $n = null; echo (int)$n; // answer is 0

Примечание: это может быть правильно, поэтому, если это не сработало, сообщите в комментариях.

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

Ниже (псевдокод) используется отключение питания коллекции Laravel. Я предлагаю вам прочитать документы Laravel по коллекциям: https://laravel.com/docs/7.x/collections#method -first-where

// Your original query slightly altered (pay attention to the toArray being removed)
// $models = 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();

// $models is now resembles your result from the above.
$models = collect([
  ['count' => 1, 'month' => 1],
  ['count' => 10, 'month' => 3],
  ['count' => 1, 'month' => 5],
  ['count' => 15, 'month' => 7],
  ['count' => 1, 'month' => 9],
  ['count' => 25, 'month' => 11],
]);

$months = collect(range(1, 12))->map(
  function ($month) use ($models) {
    $match = $models->firstWhere('month', $month);
    return $match ? $match['count'] : 0;
  }
);

Результат $ месяцев

=> Illuminate\Support\Collection {#1046
     all: [
       1,
       0,
       10,
       0,
       1,
       0,
       15,
       0,
       1,
       0,
       25,
       0,
     ],
   }
...