Почему я не могу создать ежемесячный отчет о продажах с Chart.js в Codeigniter - PullRequest
0 голосов
/ 10 октября 2019

У меня есть диаграмма, созданная с помощью chart.js

Ежедневно я получаю итоговые данные из базы данных, и в некоторые дни нет такой прибыли:

id | seller | date             | quantity | price | total

1    3636    2019-10-09 10:00   4           1,2      4,8
2    3045    2019-10-09 15:51   2           0,6      1,2
3    3636    2019-10-06 11:05   8           1,0      8,0
4    3636    2019-10-04 14:03   5           0,9      4,5
5    3636    2019-10-01 14:57   3           0,4      1,2

Как вы видите, есть 9 продаж 9 октября, 1 продажа 6 октября, 5 продаж 4 октября и 1 продажа 1 октября.

Я создаю код для этого, но он работает не оченьхорошо:

//$kazanc_v is sales dates array which is come from the controller
            for($i=1;$i<31;$i++)
            { 
                $arr2[]=date('Y').'-'.date('m').'-'.$i;
            }
            for($k=0;$k<30;$k++){
                  if(in_array($arr2[$k],$kazanc_v[0])){
                         echo $kazanc_v->sub_total;
                      } else {
                          echo '0,';
                }
             }

Когда я получаю данные в наборы данных, диаграмма выглядит следующим образом:

enter image description here

для не вижуimg: неверный график

Я не могу написать '0' в данных диаграмм, потому что в таблице нет данных. Я хочу написать 0, когда нет продаж по датам, и график должен быть таким, какой я хочу

October sales report, потому что не вижу img: [октябрьские отчеты] 3

Как создать реальный отчет?

1 Ответ

2 голосов
/ 11 октября 2019

Прежде всего, давайте проясним немного, я вижу $kazanc_v[0] и $kazanc_v->sub_total это и есть объект или массив? Каков вывод этой переменной?

Также работа с таким выводом заставит вас сделать ошибку. Если вы хотите показать общее количество продаж или суммарную цену за дату, вы должны получить данные из базы данных, сгруппированные по дате.

Ваш запрос в вашей модели должен выглядеть примерно так:

//in your model
$this->db->select("count(quantity) as qty, DATE(order_date) as date") 
         ->from("orders")
         ->where(order_date > "2021-01-01") //beginning of this month
         ->group_by('date')
         ->get()
         ->result_array()
 ;

Теперь вам нужно сначала создать x-axis. В вашем случае общее число дней в месяце (мы считаем 31 день)

//in your controller
$begin = new DateTime( date('Y-m-01') ); //or given date
$end = new DateTime( date('Y-m-t') );
$end = $end->modify( '+1 day' ); 
$interval = new DateInterval('P1D');
$dateRange = new DatePeriod($begin, $interval ,$end);

у вас есть массив с датами, теперь вы можете создавать данные диаграммы с осями Y и X с данными, поступающими из вашей модели.

$chartData =[];
$kazanc = $this->some_model->some_method();  

foreach($dateRange as $date){
  $dataKey = array_search($date->format("Y-m-d"), array_column($kazanc, 'date'));
  if ($dataKey !== false) { // if we have the data in given date
      $chartData[$date->format("Y-m-d")] = $kazanc[$dataKey]['qty'];
  }else {
      //if there is no record, create default values
     $chartData[$date->format("Y-m-d")] = 0;
  }
}

//send data to view
$this->load->view('template', ["chartData" => $chartData]);

Теперь у вас есть дата (ось X) и кол-во (ось Y) для данных за 31 день в переменной $chartData.

Наконец, мы можем напечатать наши данные вПосмотреть. Согласно документации chartjs, что-то вроде этого.

// in your view
var options = {
  type: 'line',
  data: {
   labels: <?php echo json_encode(array_keys($chartData)); ?>,
   datasets: [
        {
          label: '# Total Quantity',
          data: <?php echo json_encode(array_values($chartData)); ?>,
          borderWidth: 1
        }
    ]
 },

пример рабочего кода (php) https://www.tehplayground.com/pmiPYk3yhIpExJqa

jsfiddle для chartjs. https://jsfiddle.net/jwf67voe/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...