Yii2:在gridview的页脚中获取总和

Yii2 : Get Sum In footer of gridview

我是新来的,无法发表评论here

当我尝试在页脚中获取总和时遇到问题。

我在控制器中的代码:

$searchModel = new ReceiptsSearch();
$sum = new ReceiptsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
 return $this->render('index', [
   'searchModel' => $searchModel,
   'dataProvider' => $dataProvider,
   'sum'=>$sum,
   ]);

我的 SearchModel 代码:

public function search($params)
{
    $query = Receipts::find();
    $sum = $query->sum('price');
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    if (!$this->validate()) {
        return $dataProvider;
    }
    $query->joinWith('patient'); 
    $query->andFilterWhere([
       'id' => $this->id,
       'price' => $this->price,
       'reg_date' => $this->reg_date,
    ]);
    $query->andFilterWhere(['like','patient.patient_name',$this->patient_id]);

    return $dataProvider;$sum;
}

我的浏览页

<?= GridView::widget([

    'dataProvider' => $dataProvider,$sum,

    'filterModel' => $searchModel,
    'showFooter' => true,
    'columns' => [

        ['class' => 'yii\grid\SerialColumn'],

        [
        'attribute'=>'patient_id',
        'value'=>'patient.patient_name'
        ],
        'price',
        ],
        [
        'attribute' => 'sum',
        'footer' => 'sum',
        ],
        ['class' => 'yii\grid\ActionColumn'],
    ],
    ]); 
?>

显示的消息是:

Setting unknown property: yii\grid\GridView::0

页脚通常用于列的总结果(而不是用于单独的列)

假设 $sum 是您希望看到的价格列下方的值

 <?= GridView::widget([
  'dataProvider' => $dataProvider
  'filterModel' => $searchModel,
  'showFooter' => true,
  'columns' => [
      ['class' => 'yii\grid\SerialColumn'],
      [
        'attribute'=>'patient_id',
        'value'=>'patient.patient_name'
      ],
      [
        'attribute'=>'price',
        'footer' => $sum,       
      ],
      ['class' => 'yii\grid\ActionColumn'],
    ],
  ]); 
?>

但是查看你的代码你有几个错误..

在搜索中这是错误的

 return $dataProvider;$sum;

您只能return一个值,所以您应该

  return $dataProvider;

在你的控制器中这是错误的

 $searchModel = new ReceiptsSearch();
 $sum = new ReceiptsSearch();

$sum 的结果与 $searcModel 的结果相同,没有为 $sum return编辑新值

您应该以这种方式执行 $sum 的查询

$sum = Receipts::find()->sum('price');



$searchModel = new ReceiptsSearch();
$sum = Receipts::find()->sum('price');
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
  'searchModel' => $searchModel,
  'dataProvider' => $dataProvider,
   'sum'=>$sum,
  ]);

控制器

$searchModel = new ReceiptsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
  'searchModel' => $searchModel,
  'dataProvider' => $dataProvider,
]);

SearchModel

public function search($params)
{
  $query = Receipts::find()->joinWith('patient');

  $dataProvider = new ActiveDataProvider([
    'query' => $query,
  ]);

  $this->load($params);

  if (!$this->validate()) {
      return $dataProvider;
  }

  $query->andFilterWhere([
     'id' => $this->id,
     'price' => $this->price,
     'reg_date' => $this->reg_date,
  ]);

  $query->andFilterWhere(['like','patient.patient_name',$this->patient_id]);

  return $dataProvider;
}

查看

<?= GridView::widget([
   'dataProvider' => $dataProvider,
   'filterModel' => $searchModel,
   'showFooter' => true,
   'columns' => [
       ['class' => 'yii\grid\SerialColumn'],

       [
         'attribute' => 'patient_id',
         'value' => 'patient.patient_name'
       ],
       [
         'attribute' => 'price',
         'footer' => Receipts::getTotal($dataProvider->models, 'price'),       
       ],

       ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

收据模型

public static function getTotal($provider, $fieldName)
{
    $total = 0;

    foreach ($provider as $item) {
        $total += $item[$fieldName];
    }

    return $total;
}

不用辅助函数也可以用use kartik\grid\GridView;达到同样的效果

只需将 'showPageSummary' => true 添加到您的 GridView 配置,并将 pageSummary' => true 添加到您需要求和的列。

查看

use kartik\grid\GridView;

echo GridView::widget([
       'dataProvider' => $dataProvider,
       'filterModel' => $searchModel,
       'showPageSummary' => true,
       'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            [
                'attribute' => 'patient_id',
                'value' => 'patient.patient_name'
            ],
            [
                'attribute' => 'price',
                'pageSummary' => true
            ],
            ['class' => 'yii\grid\ActionColumn'],
       ],
]); ?>