如何在Yii2 ArrayDataProvider中对当前页面显示的项进行额外的计算?

问题描述 投票:0回答:1

我正在创建一个像这样的

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
的额外计算?

php yii2
1个回答
0
投票

getModels
ArrayDataProvider
方法返回当前页面中数据模型的数组,而不是对它们的引用。所以你的计算不会影响原始数据模型。

但是你可以直接在

GridView
中进行计算,如下所示:

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        [
            'label' => 'value',
            'content' => function ($model, $key, $index, $column) {
                //... $result = do the calculations
                return $result;
            }
        ],
    ],
]);

© www.soinside.com 2019 - 2024. All rights reserved.