我对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'
是select的列。
答案 0 :(得分:3)
You need to install PHP intl extension.i had the same error
given below is my working code in controller
$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,
]);
}
and below is my view
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'Booking_id',
'Booking_date',
'Movie',
'Theatre',
'Amount',
//~ ['class' => 'yii\grid\ActionColumn'],
],
]); ?>
答案 1 :(得分:1)
我遇到了同样的问题,很容易解决。你需要将数据库分配如下:
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,
]);
}
答案 2 :(得分:0)
您需要取消注释
extension = php_mysql.dll
和
extension = php_mysqli.dll
在你的php.ini中,让我知道是否有效
答案 3 :(得分:0)
有文档:https://www.yiiframework.com/doc/guide/2.0/en/output-data-providers#sql-data-provider
示例:
创建$ dataProvider(控制器):
z-index
创建GridView(视图):
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,
]);
}
}
答案 4 :(得分:0)
基本问题的最简单解决方案是:
$dataProvider = new SqlDataProvider([
'sql' => '<your query/>',
]);
echo GridView::widget([
'dataProvider' => $dataProvider,
]);
使用SqlDataProvider和GridView参数将其充实得像您一样复杂。