我正在创建一个像这样的
ArrayDataProvider
:
$dataProvider = new ArrayDataProvider([
'allModels' => $data,
'sort' => [
'attributes' => [
'quantity',
],
'defaultOrder' => [
'quantity' => SORT_DESC,
]
],
'pagination' => [
'pageSize' => 10
]
]);
假设
$data
数组包含 1000 个元素。我想要执行资源密集型计算,但对所有 1000 个元素执行这些计算太慢了。因此,我只想将这些计算应用于当前页面上显示的项目,在本例中是前 10 个元素。
为了实现这一点,我添加了以下代码:
$allModels = $dataProvider->getModels();
foreach ($allModels as &$model) {
// Some complex calculations with value assignment
$model['value'] = 123;
}
但是,当我将
$dataProvider
传递给 GridView
时,页面上显示的元素不包含我之前创建的 value 键。如果我处理后立即输出$dataProvider->getModels()
,也会出现同样的问题。
如何仅对当前页面显示的项目进行
ArrayDataProvider
的额外计算?
getModels
的ArrayDataProvider
方法返回当前页面中数据模型的数组,而不是对它们的引用。所以你的计算不会影响原始数据模型。
但是你可以直接在
GridView
中进行计算,如下所示:
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
[
'label' => 'value',
'content' => function ($model, $key, $index, $column) {
//... $result = do the calculations
return $result;
}
],
],
]);