yii框架结合charjs统计上一年与当前年数据的方法示例

本文实例讲述了yii框架结合charjs统计上一年与当前年数据的方法。分享给大家供大家参考,具体如下:

理论上是1年有12个月,但实际上却是去年12个月已经过了,是完整的12个月,今年的12个月还没过,不完整,所以需要补齐

public static function getYearOrderCharData() {
    // 获取当前年
    $months = range(1, 12);
    $currentYear = date('Y');
    $lastYear = date('Y', strtotime("-1 year"));
    // 所有订单
    $allOrderData = self::find()
            ->select(['FROM_UNIXTIME(create_at,"%Y-%m") as char_time', 'COUNT(id) as total_order', 'SUM(order_amount) as total_order_amount'])
            ->where(['>=', 'FROM_UNIXTIME(create_at,"%Y")', $lastYear])
            ->groupBy('char_time')
            ->all();
    // 已支付订单
    $allPayOrderData = self::find()
            ->select(['FROM_UNIXTIME(create_at,"%Y-%m") as char_time', 'COUNT(id) as total_order', 'SUM(pay_amount) as total_order_amount'])
            ->where(['>=', 'FROM_UNIXTIME(create_at,"%Y")', $lastYear])
            ->andWhere(['pay_status' => 2])
            ->groupBy('char_time')
            ->all();
    $yearCountTitle   = Yii::t('backend', 'year_order_count_title', ['last_year' => $lastYear, 'current_year' => $currentYear]);
    $yearAmountTitle  = Yii::t('backend', 'year_order_amount_title', ['last_year' => $lastYear, 'current_year' => $currentYear]);
    $yearPayCountTitle = Yii::t('backend', 'year_order_pay_count_title', ['last_year' => $lastYear, 'current_year' => $currentYear]);
    $yearPayAmountTitle = Yii::t('backend', 'year_order_pay_amount_title', ['last_year' => $lastYear, 'current_year' => $currentYear]);

    $labels = [];
    // 所有订单
    $lastYearCounts = []; // 前一年月订单总量
    $lastYearAmounts = []; // 前一年月订单总额
    $currentYearCounts = []; // 当前年月订单总量
    $currentYearAmounts = []; // 当前年月订单额
    $allOrderDataArr = [];
    foreach($allOrderData as $allKey => $allVal) {
      $allOrderDataArr[$allVal->char_time]['char_time'] = $allVal->char_time;
      $allOrderDataArr[$allVal->char_time]['total_order'] = $allVal->total_order;
      $allOrderDataArr[$allVal->char_time]['total_order_amount'] = number_format($allVal->total_order_amount / 100, 2, '.', '');
    }

    // 已支付订单
    $lastYearPayCounts = []; // 前一年月支付订单总量
    $lastYearPayAmounts = []; // 前一年月支付订单总额
    $currentYearPayCounts = []; // 当前年月支付订单总量
    $currentYearPayAmounts = []; // 当前年月支付订单额
    $allPayOrderDataArr = [];
    foreach($allPayOrderData as $payKey => $payVal) {
      $allPayOrderDataArr[$payVal->char_time]['char_time'] = $payVal->char_time;
      $allPayOrderDataArr[$payVal->char_time]['total_order'] = $payVal->total_order;
      $allPayOrderDataArr[$payVal->char_time]['total_order_amount'] = number_format($payVal->total_order_amount / 100, 2, '.', '');
    }

    foreach($months as $key => $val) {
      $label = $val . Yii::t('backend', 'month');
      $labels[] = $label;
      $theMonth = strlen($val) == 2 ? $val : '0' . $val;
      // 上一年
      $lastYearMonth = $lastYear . '-' . $theMonth;
      if(array_key_exists($lastYearMonth, $allOrderDataArr)) {
        $lastYearCounts[] = $allOrderDataArr[$lastYearMonth]['total_order'];
        $lastYearAmounts[] = $allOrderDataArr[$lastYearMonth]['total_order_amount'];
      } else {
        $lastYearCounts[] = '0';
        $lastYearAmounts[] = '0';
      }
      if(array_key_exists($lastYearMonth, $allPayOrderDataArr)) {
        $lastYearPayCounts[] = $allPayOrderDataArr[$lastYearMonth]['total_order'];
        $lastYearPayAmounts[] = $allPayOrderDataArr[$lastYearMonth]['total_order_amount'];
      } else {
        $lastYearPayCounts[] = '0';
        $lastYearPayAmounts[] = '0';
      }

      // 当前年
      $currentYearMonth = $currentYear . '-' . $theMonth;
      if(array_key_exists($currentYearMonth, $allOrderDataArr)) {
        $currentYearCounts[] = $allOrderDataArr[$currentYearMonth]['total_order'];
        $currentYearAmounts[] = $allOrderDataArr[$currentYearMonth]['total_order_amount'];
      } else {
        $currentYearCounts[] = '0';
        $currentYearAmounts[] = '0';
      }
      if(array_key_exists($currentYearMonth, $allPayOrderDataArr)) {
        $currentYearPayCounts[] = $allPayOrderDataArr[$currentYearMonth]['total_order'];
        $currentYearPayAmounts[] = $allPayOrderDataArr[$currentYearMonth]['total_order_amount'];
      } else {
        $currentYearPayCounts[] = '0';
        $currentYearPayAmounts[] = '0';
      }
    }
    $data = [
      'yearCountTitle'     => $yearCountTitle,
      'yearAmountTitle'    => $yearAmountTitle,
      'yearPayCountTitle'   => $yearPayCountTitle,
      'yearPayAmountTitle'   => $yearPayAmountTitle,
      'lastYear'        => $lastYear,
      'currentYear'      => $currentYear,
      'labels'         => $labels,
      'lastYearCounts'     => $lastYearCounts,
      'lastYearAmounts'    => $lastYearAmounts,
      'currentYearCounts'   => $currentYearCounts,
      'currentYearAmounts'   => $currentYearAmounts,
      'lastYearPayCounts'   => $lastYearPayCounts,
      'lastYearPayAmounts'   => $lastYearPayAmounts,
      'currentYearPayCounts'  => $currentYearPayCounts,
      'currentYearPayAmounts' => $currentYearPayAmounts,
    ];
    return $data;
  }

js

// 订单总量对比
  var yearOrderCountChartCanvas = $('#yearOrderCountChart').get(0).getContext('2d')
  var yearOrderCountChartData = {
   labels : <?= json_encode($orderChar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderChar['lastYear'] ?>',
     backgroundColor   : 'rgba(0, 192, 239, 0.5)',
     data        : <?= json_encode($orderChar['lastYearCounts'], true) ?>
    },
    {
     label        : '<?= $orderChar['currentYear'] ?>',
     backgroundColor   : 'rgba(0, 135, 239, 0.5)',
     data        : <?= json_encode($orderChar['currentYearCounts'], true) ?>
    }
   ]
  }

  var yearOrderCountChartOptions = {
    scales: {
      xAxes: [{
        gridLines: {
          display: false
        }
      }],
      yAxes: [{
        gridLines: {
          display: false
        }
      }]
    }
  }

  var yearOrderCountChart = new Chart(yearOrderCountChartCanvas, {
    type: 'line',
    data: yearOrderCountChartData,
    options: yearOrderCountChartOptions
  });

  // 支付订单总量对比
  var yearOrderPayCountChartCanvas = $('#yearOrderPayCountChart').get(0).getContext('2d')
  var yearOrderPayCountChartData = {
   labels : <?= json_encode($orderChar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderChar['lastYear'] ?>',
     backgroundColor   : 'rgba(0, 166, 90, 0.5)',
     data        : <?= json_encode($orderChar['lastYearPayCounts'], true) ?>
    },
    {
     label        : '<?= $orderChar['currentYear'] ?>',
     backgroundColor   : 'rgba(0, 166, 11, 0.5)',
     data        : <?= json_encode($orderChar['currentYearPayCounts'], true) ?>
    }
   ]
  }

  var yearOrderPayCountChartOptions = {
    scales: {
      xAxes: [{
        gridLines: {
          display: false
        }
      }],
      yAxes: [{
        gridLines: {
          display: false
        }
      }]
    }
  }

  var yearOrderPayCountChart = new Chart(yearOrderPayCountChartCanvas, {
    type: 'line',
    data: yearOrderPayCountChartData,
    options: yearOrderPayCountChartOptions
  });

  // 订单总额对比
  var yearOrderAmountChartCanvas = $('#yearOrderAmountChart').get(0).getContext('2d')
  var yearOrderAmountChartData = {
   labels : <?= json_encode($orderChar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderChar['lastYear'] ?>',
     backgroundColor   : 'rgba(0, 192, 239, 0.5)',
     data        : <?= json_encode($orderChar['lastYearAmounts'], true) ?>
    },
    {
     label        : '<?= $orderChar['currentYear'] ?>',
     backgroundColor   : 'rgba(0, 135, 239, 0.5)',
     data        : <?= json_encode($orderChar['currentYearAmounts'], true) ?>
    }
   ]
  }

  var yearOrderAmountChartOptions = {
    scales: {
      xAxes: [{
        gridLines: {
          display: false
        }
      }],
      yAxes: [{
        gridLines: {
          display: false
        }
      }]
    }
  }

  var yearOrderAmountChart = new Chart(yearOrderAmountChartCanvas, {
    type: 'line',
    data: yearOrderAmountChartData,
    options: yearOrderAmountChartOptions
  });

  // 支付订单总额对比
  var yearOrderPayAmountChartCanvas = $('#yearOrderPayAmountChart').get(0).getContext('2d')
  var yearOrderPayAmountChartData = {
   labels : <?= json_encode($orderChar['labels'], true) ?>,
   datasets: [
    {
     label        : '<?= $orderChar['lastYear'] ?>',
     backgroundColor   : 'rgba(0, 166, 90, 0.5)',
     data        : <?= json_encode($orderChar['lastYearPayAmounts'], true) ?>
    },
    {
     label        : '<?= $orderChar['currentYear'] ?>',
     backgroundColor   : 'rgba(0, 166, 11, 0.5)',
     data        : <?= json_encode($orderChar['currentYearPayAmounts'], true) ?>
    }
   ]
  }

  var yearOrderPayAmountChartOptions = {
    scales: {
      xAxes: [{
        gridLines: {
          display: false
        }
      }],
      yAxes: [{
        gridLines: {
          display: false
        }
      }]
    }
  }

  var yearOrderPayAmountChart = new Chart(yearOrderPayAmountChartCanvas, {
    type: 'line',
    data: yearOrderPayAmountChartData,
    options: yearOrderPayAmountChartOptions
  });

记住,yii的as一定要在模型利定义公共变量

public $char_time; // 按时间统计
  public $total_order; // 所有订单
  public $total_order_amount; // 所有订单总额
  public $total_pay_order; // 支付订单
  public $total_pay_amount; // 支付订单总额
  public $total_order_pay_amount; // 支付总额

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

(0)

相关推荐

  • Yii实现多数据库主从读写分离的方法

    本文实例讲述了Yii实现多数据库主从读写分离的方法.分享给大家供大家参考.具体分析如下: Yii框架数据库多数据库.主从.读写分离 实现,功能描述: 1.实现主从数据库读写分离 主库:写 从库(可多个):读 2.主数据库无法连接时 可设置从数据库是否 可写 3.所有从数据库无法连接时 可设置主数据库是否 可读 4.如果从数据库连接失败 可设置N秒内不再连接 利用yii扩展实现,代码如下: 复制代码 代码如下: <?php /**  * 主数据库 写 从数据库(可多个)读  * 实现主从数据库 读

  • yii框架结合charjs实现统计30天数据的方法

    本文实例讲述了yii框架结合charjs实现统计30天数据的方法.分享给大家供大家参考,具体如下: 理论上30天数据应该都有,但实际上却不一定是,所以需要补全 public static function getDayOrderCharData($days = 30) { $nowDay = date('Y-m-d', strtotime('-1day')); // 当前前一天 $lastDay = date("Y-m-d", strtotime('-'.$days.'day'));

  • yii 框架实现按天,月,年,自定义时间段统计数据的方法分析

    本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法.分享给大家供大家参考,具体如下: 天(day): 格式Y-m-d 月(month):格式Y-m 年(year):格式Y 时间段(range): 格式Y-m-d 首先计算时间 天0-23小时 $rangeTime = range(0, 23); 月:1-月底 // $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); $days = date("t",str

  • 解析yii数据库的增删查改

    1. 存取数据库方法存储第一种存表时候用到例子: 复制代码 代码如下: $post=new Post;$post->title='samplepost';$post->content='content for thesample post';$post->createTime=time();/$post->createTime=newCDbexpression_r('NOW()');$post->save();$user_field_data= new user_field_

  • Yii2 批量插入、更新数据实例

    在使用yii2开发项目时,有时候会遇到这样的情况: 向后台发送多条数据,其中一些数据已经存在记录,只需要对其部分字段的值进行修改;而另一部分的数据则需要新添加进去. 这就需要对添加的数据进行判断,其中一些执行update,剩下的执行insert 代码如下,不对的地方请指教: //批量更新,并将需要批量插入的数据放入数组中 foreach($goods as $k => $v) { if(yourModel::updateAllCounters( ['goods_num' => $v], ['g

  • Yii2框架数据库简单的增删改查语法小结

    User::find()->all(); //返回所有用户数据: User::findOne($id); //返回 主键 id=1 的一条数据: User::find()->where(['name' => 'ttt'])->one(); //返回 ['name' => 'ttt'] 的一条数据: User::find()->where(['name' => 'ttt'])->all(); //返回 ['name' => 'ttt'] 的所有数据: U

  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作. User::find()->all();    //返回所有用户数据: User::findOne($id);   //返回 主键 id=1  的一条数据: User::find()->where(['name' => 'ttt'])->one();   //返回 ['name' => 'ttt'] 的一条数据: User::find(

  • Yii实现MySQL多数据库和读写分离实例分析

    本文实例分析了Yii实现MySQL多数据库和读写分离的方法.分享给大家供大家参考.具体分析如下: Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能,也是最强大的框架之一,下文我们来介绍Yii实现MySQL多库和读写分离的方法 前段时间为SNS产品做了架构设计,在程序框架方面做了不少相关的压力测试,最终选定了YiiFramework,至于为什么没选用公司内部的 PHP框架,其实理由很充分,公司的框

  • Yii中的relations数据关联查询及统计功能用法详解

    本文实例讲述了Yii中的relations数据关联查询及统计功能用法.分享给大家供大家参考,具体如下: 关联查询,Yii 也支持所谓的统计查询(或聚合查询). 它指的是检索关联对象的聚合信息,例如每个 post 的评论的数量,每个产品的平均等级等. 统计查询只被 HAS_MANY(例如,一个 post 有很多评论) 或 MANY_MANY (例如,一个 post 属于很多分类和一个 category 有很多 post) 关联对象执行. 执行统计查询非常类似于之前描述的关联查询.我们首先需要在 C

  • Yii统计不同类型邮箱数量的方法

    本文实例讲述了Yii统计不同类型邮箱数量的方法.分享给大家供大家参考,具体如下: 效果图: 控制器: //查询邮箱 public function actionEmail() { /* //查询所有邮箱数据(1种) $arr=Users::find("select * from users")->asArray()->all(); //var_dump($data);die; $data=array(); //取出邮箱类型 foreach($arr as $key=>

  • Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+MYSQL锁表防止并发情况下重复数据的方法.分享给大家供大家参考,具体如下: lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从表中读数据,不能进行任何写操作. lock tables user read;//读锁定表 unlock tables;//解锁 lock tables user read local;//本地读锁定表,其他线程的insert未被阻塞,update操作被阻塞 lock table 写锁定 如果一个线

  • yii框架表单模型使用及以数组形式提交表单数据示例

    按Yii文档里的描述,Yii在处理表单的一般过程是: 创建表单对应的模型类,设置字段验证规则创建表单提交对应的action,处理提交的内容在视图中创建表单form在刚刚的一个小项目里,想使用ajax提交表单信息并验证保存,又不想用隐藏iframe来做无刷新提交,并且action中能够用到模型类的校验方法,就想到使用表单数组提交的方式,举个例子: form代码: 复制代码 代码如下: <form action='' method='post' name='form_test'>    <i

随机推荐