簡體   English   中英

yii2 忽略分頁計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM