Gridview 一列的Yii2 DataPorivider$totalSum

Gridview 一列的Yii2 DataPorivider$totalSum,gridview,yii2,Gridview,Yii2,我有订单和订单搜索模型 在带有GridView的订单列表(actionIndex)中,有一个过滤和排序功能。 按顺序排列的列中有一列是Order_total(按顺序排列的所有产品的总和) 我需要在GridView中实现所有订单总和。 如果我通过使用数组映射计算ActiveDataProvider->getModels()来手动执行此操作,我将花费3秒钟来处理3000个订单(localhost)。我不想错过这么多时间 我认为有两种方法可以加快速度: 为每个筛选器创建缓存并按生存期更新(可怕) 最有

我有订单和订单搜索模型

在带有GridView的订单列表(actionIndex)中,有一个过滤和排序功能。 按顺序排列的列中有一列是Order_total(按顺序排列的所有产品的总和)

我需要在GridView中实现所有订单总和。 如果我通过使用数组映射计算ActiveDataProvider->getModels()来手动执行此操作,我将花费3秒钟来处理3000个订单(localhost)。我不想错过这么多时间

我认为有两种方法可以加快速度:

  • 为每个筛选器创建缓存并按生存期更新(可怕)
  • 最有趣的是,我可以在OrderSearch->search()方法中作为$query方法正确地执行它。但我不明白如何将其传递到控制器中
  • 第二种方式的代码示例:

    class OrderSearch extends Order
    {
    
        public $totalSum; 
    
        public function search($params)
        {
            $query = Order::find();
    
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
            ]);
    
            $this->load($params);
    
            $this->totalSum = $query->sum('order_total'); // this works very fast
    
            return $dataProvider;
        }
    
    }
    
    之后,我将尝试在控制器中获取此属性:

    public function actionIndex()
    {
        $searchModel = new OrderSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
        $dataProvider->pagination->pageSize = 100;
    
        // code below works too slow and depends on pagination page size
        // $orders = $dataProvider->getModels();
        // $totalSum = 1.0;
        // array_map(function($item) use (&$totalSum) {
        //     $totalSum += (float)$item->attributes['order_total'];
        // }, $dataProvider->getModels());
    
        // here I get an error
        // Unknown Property – yii\base\UnknownPropertyException
        // Getting unknown property: yii\data\ActiveDataProvider::totalSum
        $totalSum = $dataProvider->totalSum;
    
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'totalSum' => $totalSum,
        ]);
    }
    
    如何设置数据提供程序的自定义属性?

    您写道:

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
    因此,
    $dataProvider
    将返回该方法。正如你在这里看到的:

    public function search($params)
    {
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
    
        // code
    
        return $dataProvider;
    }
    
    方法
    search
    返回一个。使用该方法后,应调用原始类的属性:

    $searchModel = new OrderSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); // run search, so now we have a totalSum.
    $totalSum = $searchModel->totalSum;
    
    你写道:

    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
    因此,
    $dataProvider
    将返回该方法。正如你在这里看到的:

    public function search($params)
    {
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
    
        // code
    
        return $dataProvider;
    }
    
    方法
    search
    返回一个。使用该方法后,应调用原始类的属性:

    $searchModel = new OrderSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); // run search, so now we have a totalSum.
    $totalSum = $searchModel->totalSum;
    

    获取
    $totalSum
    并添加一个字段

    改变

    $query = Order::find();
    

    如果使用字符串,请注意转义

    也可以考虑使用子查询,如

    e、 g


    获取
    $totalSum
    并添加一个字段

    改变

    $query = Order::find();
    

    如果使用字符串,请注意转义

    也可以考虑使用子查询,如

    e、 g


    使用
    $totalSum=$searchModel['totalSum']而不是
    $totalSum=$dataProvider->totalSum谢谢!这比我想象的要简单:))使用
    $totalSum=$searchModel['totalSum']而不是
    $totalSum=$dataProvider->totalSum谢谢!这比我想象的要容易:))