php - 为什么我无法在 Codeigniter 中使用 Chart.js 创建月度销售报告

标签 php codeigniter chart.js

我有一个使用 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

如您所见,10 月 9 日有 2 笔销售,10 月 6 日有 1 笔销售,10 月 4 日有 5 笔销售,10 月 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:wrong chart

我无法在图表数据中写入“0”,因为表中没有数据。 我想在日期没有销售时写 0,图表应该是这样的,我想要

October sales report 对于看不到img:[october reports] 3

如何创建真实的报告?

最佳答案

首先,让我们澄清一下,我看到 $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]);

现在,您在 $chartData 变量中拥有 31 天数据的日期(x 轴)和数量(y 轴)。

最后,我们可以在 View 中打印数据。根据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

用于图表js的jsfiddle。 https://jsfiddle.net/jwf67voe/

关于php - 为什么我无法在 Codeigniter 中使用 Chart.js 创建月度销售报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330220/

相关文章:

php - 最佳实践 : Creating a simple CRUD web application with users/roles

php - 内部加入在 laravel 中使用哪里?

php - Laravel 具有多种关系的 Eloquent 查询

javascript - 图片加载像 google image PHP

javascript - Chart.js - 在单杠内写标签?

javascript - 如何根据折线图的 Chartjs 中的用户输入动态更改 Y 轴值?

javascript - Chart JS Line Graph multitooltipkey背景颜色问题

php - 扫描日志中的错误和电子邮件错误行

php - 添加计算按钮

php - 如何仅获取特定日期而非日期范围的 Google 日历事件