【问题标题】:Yii2: How to have sum in footer based on previous pages' sum?Yii2:如何根据前几页的总和在页脚中有总和?
【发布时间】:2015-09-18 18:52:42
【问题描述】:

请看下图。

如您所见,汇总列中的总数为 215340。我想要的是在下一页中它应该开始对这个数字上的这些数字求和。

这是一个代码。

 GridView::widget([
    'dataProvider' => $dataProvider,
    //  'filterModel' => $searchModel,
    'columns' => [
      [
        'class' => 'kartik\grid\SerialColumn'],
      //     'id',
      [
        'attribute' => 'customer_id',
        'value' => function ($data) {
          return $data->customerDetail->account_no;
        }
      ],
      [
        'attribute' => 'naration',
        'pageSummary' => 'Total',
      ],
      [
      'attribute' => 'transaction_type',
      'label' => 'Deposits',
      'pageSummary' => true,
      'pageSummaryOptions' => ['id' => 'total_sum'],
      'value' => function ($data) {
        if($data->transaction_type==10)
          return $data->amount;
        else
          return 0;
        }
      ],
      [
      'attribute' => 'transaction_type',
      'label' => 'Withdrawals',
      'pageSummary' => true,
      'value' => function ($data) {
        if($data->transaction_type==11)
          return $data->amount;
        else
          return 0;
        }
      ],
      [
        'class' => 'backend\components\TotalColumn',
        'label' => 'Balance',
        'attribute' =>'amount',
      ],

    ],
    // This line displays sum of the columns.
    'showPageSummary' => true,
  ]);
?>

我正在考虑使用 $_GET 将此页面的总和发送到下一页,但问题是当用户转到前一页时,即从第 3 页到第 2 页。你有任何小部件或其他东西来解决这个问题吗?

【问题讨论】:

  • 好的。到目前为止,您尝试过什么?
  • @AlanMachado 什么都没有。我不明白有什么可能的方法。
  • 这就是研究工作所在。寻找它。
  • @AlanMachado 我对它进行了研究。还没找到东西。
  • 那我们就等着吧!

标签: php gridview yii2


【解决方案1】:

我的想法是使用mysql选择当前列中所有记录的总和并将这个值与上一页的总值相加,我需要知道这个查询当前页面的偏移量和限制,我可以得到那些来自数据提供者的值,为了实现这一点,我必须重写函数\yii\grid\Column::renderFooterCellContent()

扩展\yii\grid\DataColumn

namespace frontend\components;

use yii\helpers\ArrayHelper;

class DataColumn extends \yii\grid\DataColumn
{
    protected function renderFooterCellContent()
    {
        if ($this->footer instanceof \Closure) {
            return call_user_func($this->footer, ArrayHelper::getValue($this, 'grid.dataProvider.pagination'));
        } else {
            return parent::renderFooterCellContent();
        }
    }
}

您的视图文件

use frontend\models\Client;
use yii\db\Expression;
use yii\db\Query;
use yii\grid\GridView;
use yii\data\Pagination;
use frontend\components\DataColumn;

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'dataColumnClass' => DataColumn::className(),
    'showFooter' => true,
    'columns' => [
        //['class' => 'yii\grid\SerialColumn'],
        'id',
        [
            'attribute' => 'num_users',
            'footer' => function ($pagination) {
                if ($pagination instanceof Pagination) {
                    $offset = $pagination->offset;
                    $limit = $pagination->limit;

                    $cquery = (new Query())
                        ->select(['sub_users' => new Expression('SUM(num_users)')])
                        ->from([
                            'cpage' => (new Query())
                                ->select('num_users')
                                ->offset($offset)
                                ->limit($limit)
                                ->from(Client::tableName())
                        ]);

                    //negative offset is illegal
                    if ($offset > 0) {
                        $pquery = (new Query())
                            ->select(['sub_users' => new Expression('SUM(num_users)')])
                            ->from([
                                'ppage' => (new Query())
                                    ->select('num_users')
                                    ->offset(0)
                                    ->limit($offset)
                                    ->from(Client::tableName())
                            ]);
                        $cquery->union($pquery, true);
                    }

                    return (new Query())->from(['subt' => $cquery])->sum('sub_users');
                }
            }
        ],
    ]
]);

原始 SQL 查询

SELECT SUM(sub_sum_users) FROM (
    SELECT SUM(num_users) as sub_sum_users FROM (
        SELECT num_users FROM `clients` LIMIT 20 OFFSET 120
    ) cpage
    UNION ALL
    SELECT SUM(num_users) as sub_sum_users FROM (
        SELECT num_users FROM `clients` LIMIT 20 OFFSET 100
    ) ppage
) sublt

注意:

你可以考虑使用 ActiveRecord,我的 girdview 有很多连接查询,所以对我来说很重

$offset = $pagination->offset;
$limit = $pagination->limit;
$cquery = Client::find()
    ->select(['sub_users' => new Expression('SUM(num_users)')])
    ->from([
        'cpage' => Client::find()->select('num_users')->offset($offset)->limit($limit)
    ]);

//negative offset is illegal
if ($offset > 0) {
    $pquery = $cquery = Client::find()
        ->select(['sub_users' => new Expression('SUM(num_users)')])
        ->from([
            'ppage' => Client::find()->select('num_users')->offset(0)->limit($offset)
        ]);
    $cquery->union($pquery, true);
}

return (new Query())->from(['subt' => $cquery])->sum('sub_users'); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-11-13
    • 2015-03-11
    • 1970-01-01
    • 2018-10-16
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多