Yii2了解dataProvider

时间:2016-09-11 13:59:22

标签: php yii2

有两种状态ORDER_PAIDORDER_DELIVERED,我需要在页面上显示5个块,其中包含以下数据集:

  1. 订单总和: 数据库中的每个项目都有字段总和,我需要计算。

  2. 状态为ORDER_PAID

  3. 的订单总和
  4. 状态为ORDER_DELIVERED
  5. 的订单总和
  6. 显示具有ORDER_PAIDORDER_DELIVERED状态
  7. 的订单之间相关性的图表
  8. 包含订单且状态为ORDER_PAID的表格。
  9. 以上所有内容取决于用户选择的数据(日期,上周,上个月)。还有4个请求

    getOrderDeliveredSum() + getOrderPaidSum() = getTotal()

    例如我的功能是:

    function getOrderPaidSum(){
             return Orders::find()
                    ->where(["owned" => \Yii::$app->user->id])
                    ->andWhere(["status.code" => "ORDER_PAID"])
                    ->sum();
        }
    

    还有getOrdersContext获取graph \ table的数据:

    function getOrdersContext($params){
    
        $query = Orders::find()
            ->where(["owned" => \Yii::$app->user->id])
            ->orderBy('id DESC');
    
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
    
        if(!($this->load($params) && $this->validate())){
            return $dataProvider;
        }
    
        $query->andFilterWhere([]);
        return $dataProvider;
    }
    

    但正如您所看到的那样,请求提取相同的数据,但用途不同。有优化机会吗?

    UPD 1 我想从我的db中获取下一个值:

    1. 当前用户的订单总和。
    2. 要获取当前用户的订单总和,我必须使用状态ORDER_PAIDORDER_DELIVERED
    3. 计算订单总和
    4. 我还使用Highcharts::widgetGridView::widget来显示数据。 (这是一个可排序的表格,其中包含状态为ORDER_PAID的订单,以及一个图表,其中显示了包含ORDER_DELIVEREDORDER_PAID的每个订单的价格。

1 个答案:

答案 0 :(得分:0)

一种简单的方法是分别计算你需要的两个总和

myTotalPaid  = Orders::find()
            ->where(["owned" => \Yii::$app->user->id])
            ->andWhere(["status.code" => "ORDER_PAID"])
            ->sum('my_column_for_sum');


myTotalDelivered  = Orders::find()
            ->where(["owned" => \Yii::$app->user->id])
            ->andWhere(["status.code" => "ORDER_DELIVERED"])
            ->sum('my_column_for_sum');    

然后获取ORDER_PAID的数据提供者

$query = Orders::find()
            ->where(["owned" => \Yii::$app->user->id])
            ->andWhere(["status.code" => "ORDER_PAID"])
            ->orderBy('id DESC');

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);