Php yii2忽略分页以进行计算

Php yii2忽略分页以进行计算,php,gridview,yii2,Php,Gridview,Yii2,我有一个GridView表,我想在其中计算余额,因为在DB中只有借项和贷项。 我在模型中添加了一个新的对象变量balance和一个保存最后一个balance的类var tempBalance 在SearchModel中,我有以下几行来计算余额 private function calculateBalance($dataProvider) { foreach ($dataProvider->models as $model) { $model->balance

我有一个GridView表,我想在其中计算余额,因为在DB中只有借项和贷项。 我在模型中添加了一个新的对象变量balance和一个保存最后一个balance的类var tempBalance

在SearchModel中,我有以下几行来计算余额

private function calculateBalance($dataProvider) {
    foreach ($dataProvider->models as $model) {
        $model->balance = parent::$tempBalance + $model->debit - $model->credit;
            parent::$tempBalance = $model->balance;
        }
}
这很好,但是当我在GridView中有20个以上的结果时,它会自动生成页面,其中每20条记录我都想保留这个分页。问题是,在每一页上,saldo都以0开头,但我仍然想要上一页最后一个条目的saldo

我曾尝试关闭计算的分页功能,然后再次打开,但这正是我努力的方向

我尝试在calculateBalance方法中的foreach循环之前关闭分页:

然后在循环后通过以下代码再次打开:

$dataProvider->setPagination($pagination);
但这并没有再次打开分页。分页仍处于关闭状态

有没有一种方法可以在我的计算中忽略分页,或者是关闭和再次打开分页的正确方法

关闭分页后如何打开分页?

$dataProvider->models已缓存,如果要更改分页设置,必须调用以强制数据提供程序从数据库中重新提取数据

比如:

// setup $dataProvider
// render GridView

$dataProvider->setPagination(false);
$dataProvider->prepare(true);
$this->calculateBalance($dataProvider);
但是,在模型上计算平衡是一个非常糟糕的主意——如果有人有数百万条记录,它会非常慢,最后你会出现内存不足的错误。您应该通过SQL查询来计算平衡-它将更快,并且不会因为大数据集而崩溃

$balanceQuery = clone $dataProvider->query;
$balanceQuery->select([
    'debit' => new Expression('SUM(debit)'),
    'credit' => new Expression('SUM(credit)'),
]);
$balanceData = $balanceQuery->asArray()->one();
$balance = $initialBalance + $balanceData['debit'] - $balanceData['credit'];

请注意,网格数据的过滤将改变平衡,因为$dataProvider->query将忽略一些数据。如果这不是有意的,您可能应该在应用筛选之前克隆$query或使用新查询,如$balanceQuery=MyModel::find->onlyForUser$userId

谢谢大家!!再次查看SQL查询并使用SQL进行查询对我很有帮助;
$balanceQuery = clone $dataProvider->query;
$balanceQuery->select([
    'debit' => new Expression('SUM(debit)'),
    'credit' => new Expression('SUM(credit)'),
]);
$balanceData = $balanceQuery->asArray()->one();
$balance = $initialBalance + $balanceData['debit'] - $balanceData['credit'];