【问题标题】:Yii2 custom sql query in gridviewYii2在gridview中自定义sql查询
【发布时间】:2015-04-29 13:29:50
【问题描述】:

我对 Yii2 很陌生。 我正在使用高级结构

我需要在不使用模型的情况下在视图中显示自定义 sql 结果,因为我想显示 sql 视图。

index.php

<?= GridView::widget([
       'dataProvider' => $dataProvider,
       'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'COD_RISORSA',
            [
                'label' =>"Nome",
                'attribute' => 'NOME',
                'value'=>function($data){
                    return $data["NOME"];
                }
            ],
            'COGNOME',
            ['class' => 'yii\grid\ActionColumn'],
        ],
   ]); ?>

VRisorseController.php

public function actionIndex()
{

    $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM v_risorse')->queryScalar();

    $dataProvider = new SqlDataProvider([
        'sql' => 'SELECT * FROM v_risorse',
        'totalCount' => $totalCount,
        'sort' =>false,
        'pagination' => [
            'pageSize' => 10,
        ],
    ]);

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

在以下网址: http://localhost/advanced/frontend/web/index.php?r=vrisorse%2Findex

我有错误:

不支持 – yii\base\NotSupportedException 消息格式 'number' 仅支持整数值。你必须安装 PHP intl 扩展以使用此功能。 1.在C:\xampp\htdocs\advanced\vendor\yiisoft\yii2\i18n\MessageFormatter.php

我尝试对gridview中的所有列进行注释,错误似乎与$dataProvider变量有关

'COD_RISORSA','NOME', 'COGNOME' 是选择的列。

【问题讨论】:

  • 该错误似乎与 intl 功能有关,请发布您的配置。
  • 在您的php.ini 中取消注释extension=php_intl.dll 并重新启动网络服务器

标签: php sql gridview yii yii2


【解决方案1】:

你需要安装 PHP intl 扩展。我有同样的错误

下面是我的工作代码 在控制器中

$count      =   Yii::$app->db->createCommand('
                    SELECT COUNT(*) FROM screen_ticket_booking_history WHERE status=:status
                    ', [':status' => 0])->queryScalar();

                    $sql =  "SELECT A1.booking_id As Booking_id,
                                A1.booking_date As Booking_date,
                                A2.movie_name As Movie,
                                A3.theatre_name As Theatre,
                                A1.amount As Amount

                                FROM 
                                screen_ticket_booking_history A1

                                LEFT OUTER JOIN movies A2 ON A1.movie_id=A2.id
                                LEFT OUTER JOIN theatres A3 ON A1.theatre_id=A3.id
                                LEFT OUTER JOIN users_backend A4 ON A3.users_backend_id=A4.id

                                WHERE A1.booking_date = '{$day}'
                                AND   A1.movie_id='{$movies->id}'";


                    //~ $models = $dataProvider->getModels(); //print_r($models);die();
                    if( $userid != '1')
                    { 
                        $sql .= " AND A3.users_backend_id = '{$userid}' ";
                    }

                    $dataProvider = new SqlDataProvider([
                    'sql' => $sql,
                    'totalCount' => $count,
                    ]);
                    return $this->render('index',
                    [   'model'             => $model,
                        'dataProvider'      => $dataProvider,
                    ]);
                }

以下是我的观点

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

           'Booking_id',
           'Booking_date',
           'Movie',
           'Theatre',
           'Amount',
           //~ ['class' => 'yii\grid\ActionColumn'],
       ],
   ]); ?>

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,很容易解决。你需要分配DB如下:

    public function actionIndex()
    {
    
        $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM v_risorse')->queryScalar();
    
        $dataProvider = new SqlDataProvider([
            **'db' => Yii::$app->db,**
            'sql' => 'SELECT * FROM v_risorse',
            'totalCount' => $totalCount,
            'sort' =>false,
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);
    
        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }
    

    【讨论】:

      【解决方案3】:

      你需要取消注释

      extension=php_mysql.dll

      extension=php_mysqli.dll

      在你的 php.ini 中,如果有效,请告诉我

      【讨论】:

        【解决方案4】:

        有文档:https://www.yiiframework.com/doc/guide/2.0/en/output-data-providers#sql-data-provider

        例子:

        创建 $dataProvider(控制器):

        public function actionIndex($src, $disposition, $start, $finish)
            {
                        $count = $connection->createCommand("
                        select COUNT(*)
                        from cdr 
                        where (Length(dst) > 6) 
                        and (start between :start and :finish)  
                        and (lastapp=\"Dial\") 
                        and src in (:src)
                        and disposition in ('ANSWERED', 'FAILED', 'BUSY', 'NO ANSWER')")
                        ->bindValue(':src', $params['src'])
                        ->bindValue(':start', $params['start'])
                        ->bindValue(':finish', $params['finish'])->queryScalar();
        
                        $sql = "select src, dst,
                        Case Disposition
                        when 'ANSWERED' then 'Отвечено'
                        when 'FAILED' then 'Ошибка'
                        when 'BUSY' then 'Занято'
                        when 'NO ANSWER' then 'Не дозвонились'    
                        else 'ИТОГ'    
                        End as status,
                        Start,
                        Round(billsec/60, 2) as Billing,
                        uniqueid
                        from cdr 
                        where (Length(dst) > 6) 
                        and (start between :start and :finish)  
                        and (lastapp=\"Dial\") 
                        and src in (:src)
                        and disposition in ('ANSWERED', 'FAILED', 'BUSY', 'NO ANSWER')";
        
                        $boundParams = [
                           ':src' => $params['src'],
                           ':start' => $params['start'],
                           ':finish' => $params['finish'],
                        ];
        
                //   Provider
                $dataProvider = new SqlDataProvider([
                    'sql' => $sql,
                    'params' => $boundParams,
                    'totalCount' => $count,
                    'pagination' => [
                        'pageSize' => 150,
                    ],
                    'sort' => [
                        'attributes' => [
                            'src',
                            'dst',
                            'Start',
                            'Billing',
                            'uniqueid',
                        ],
                    ],
                ]);
                return $this->render('index', [
                    'params' => $params,
                    'dataProvider' => $dataProvider,
                    'count' => $count,
                ]);
            }
        }
        

        创建 GridView(视图):

        echo GridView::widget([
            'dataProvider' => $dataProvider,
            'columns' => [
                ['class' => 'yii\grid\SerialColumn'],
                [
                    'label' => 'От кого',
                    'attribute' => 'src',
        //            'format' => ['decimal', 2],
                ],
                [
                    'label' => 'Кому',
                    'attribute' => 'dst',
        //            'format' => ['decimal', 2],
                ],
                [
                    'label' => 'Начало',
                    'attribute' => 'Start',
        //            'format' => ['decimal', 2],
                ],
                [
                    'label' => 'Длительность (сек)',
                    'attribute' => 'Billing',
        //            'format' => ['decimal', 2],
                ],
                [
                    'label' => 'UUID',
                    'attribute' => 'uniqueid',
        //            'format' => ['decimal', 2],
                ],
                //~ ['class' => 'yii\grid\ActionColumn'],
            ],
        ]);
        

        【讨论】:

          【解决方案5】:

          基本问题的最简单解决方案是:

              $dataProvider = new SqlDataProvider([
                      'sql' => '<your query/>',
              ]);
              echo GridView::widget([
                      'dataProvider' => $dataProvider,
              ]);
          

          使用 SqlDataProvider 和 GridView 参数尽可能复杂地充实它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多