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