Php 为什么可以';在Codeigniter中使用Chart.js创建月度销售报告

Php 为什么可以';在Codeigniter中使用Chart.js创建月度销售报告,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

我有一张用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,';
                }
             }
/$kazanc\u v是来自控制器的销售日期数组

对于($i=1;$i首先,让我们澄清一下,我看到了
$kazanc\u v[0]
$kazanc\u v->sub\u 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轴。
在你的情况下一个月的总天数(我们考虑为31天)

您有一个带有日期的数组,现在您可以使用来自模型的数据创建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轴)

最后,我们可以在视图中打印数据

// 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
        }
    ]
 },
//在您的视图中
变量选项={
键入:“行”,
数据:{
标签:,
数据集:[
{
标签:“#总数量”,
数据:,
边框宽度:1
}
]
},
示例工作代码(php)


jsfiddle for chartjs。

可能有一种更优雅的方法,但这在过去对我很有效。首先生成一个带有键的数组(和默认值
0
值)您要查看的日期。然后您可以迭代该数组,用数据库中的现有数据填充该数组。这样,所有日期都有一个条目和一个值,因此在chart.js中输出它变得很简单。添加代码,从控制器获取数据以供查看,但不会在非销售日期写入“0”,因为没有数据。您可以发布生成的实际JS(并且正在创建图表)?只有显示它不起作用的图像真的很难提供更多帮助。JS文件来自原始的图表。JS网站ı对JS文件没有问题。我的问题在于我的代码。ı无法为($i=1;$i)在javascript数据集上写入“0”
// 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
        }
    ]
 },