php
  • mysql
  • yii2
  • 2015-03-20 3 views 1 likes 
    1

    можно суммировать столбец в GridView, используя следующий код:Yii2: сумма столбца на отфильтрованных значений в Gridview

    <?php 
    $command = Yii::$app->db->createCommand("SELECT sum(net_total) FROM estimate"); 
    $sum = $command->queryScalar(); 
    echo 'Total ='. $sum; 
    ?> 
    

    У меня есть столбец в БД как discharge_date (который является дата & поле времени) и Я хочу изменить сумму на фильтр в этом столбце. То есть, если отфильтрованные данные показывают пять записей, тогда я хочу получить сумму только для этих пяти записей. Спасибо.

    обновления как в ответ

    Код выглядит так:

    $query = app\models\Estimate::find(); 
    $dataProvider = new ActiveDataProvider([ 
          'query' => $query, 
          ]); 
    $ids = []; 
    foreach($dataProvider as $i => $model) { 
        $ids[] = $model->id;} 
    
    $command = Yii::$app->db->createCommand("SELECT sum(net_total) FROM estimate WHERE `id` IN ('.implode(',',$ids).')"); // please use a prepared statement instead, just a proof of concept 
    
    $sum = $command->queryScalar(); 
    echo $sum; 
    

    Теперь я получаю ошибку на линии $ids[] = $model->id;} в Getting unknown property: yii\db\ActiveQuery::id

    ответ

    1

    Вы попробуйте добавить этот запрос прямо к ActiveDataprovider? Указание дополнительных частей запроса возможно, как описано here, что должно быть возможным решением. В качестве альтернативы вы можете попытаться извлечь идентификаторы из ActiveDataprovider для получения результатов и использовать их для изменения вторичного запроса.

    Пример второго подхода:

    // You should make sure that the same parameters are passed to 
    // the GridView's ActiveDataProvider and the Model's find() function 
    $idQuery = Estimate::find()->all(); 
    
    $ids = []; 
    foreach ($idQuery as $i => $model) { 
        $ids[] = $model['id']; 
    } 
    
    $command = Yii::$app->db->createCommand('SELECT sum(net_total) FROM estimate WHERE `id` IN ('.implode(',',$ids).')'); // please use a prepared statement instead, just a proof of concept 
    $sum = $command->queryScalar(); 
    
    +0

    Привет Nikolas Что такое '$ copyofADP = /*....*/', что я должен заменить его. Благодарю. – Pawan

    +0

    Оригинальный ActiveDataProvider, который вы создали для получения (фильтрованных) данных. –

    +0

    Привет Николас - Я обновил вопрос в соответствии с предложением ur, но я получаю ошибку, как упоминалось в вопросе. – Pawan

    Смежные вопросы