[英]yii2 Ignore pagination for calculation
我有一個 GridView 表,我想在其中計算余額,因為在數據庫中只有借方和貸方。 我在 Model 中添加了一個新的對象變量balance
和一個保存最后一個余額的 class-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
循環之前關閉分頁:
$pagination = $dataProvider->getPagination();
$dataProvider->setPagination(false);
然后通過以下代碼在循環后再次打開它:
$dataProvider->setPagination($pagination);
但這並沒有再次打開分頁。 分頁仍然關閉。
有沒有辦法忽略我的計算的分頁,或者它是否是關閉和重新打開分頁的正確方法?
關閉后如何打開分頁?
$dataProvider->models
已緩存,如果要更改分頁設置,則必須調用$dataProvider->prepare(true)
強制數據提供者從數據庫中重新獲取數據。
就像是:
// 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);
。
我通過了這個,認為這可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.