我曾尝试将cgridview与csqldataprovider一起使用。
column name = Track
它会使用... order by Track
创建查询,但实际上应该创建...order by t.trackname
。Store
和列名trackid
的同一个数据库中,我在同一个数据库中有另一个表,表名为trackid
。在控制器文件中,
$dataProvider=new CSqlDataProvider($query, array(
'totalItemCount'=>$count,
'sort'=>array('defaultOrder'=>'caseid DESC',
'attributes'=>array(
'caseid',
'trackid',
'status',
),
),
));
在视图文件中,
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'ajaxUpdate'=>true,
'columns'=>array(
array('header'=>'Case','name'=>'Case','value'=>'$data[caseid]'),
array('header'=>'Track','name'=>'Track','value'=>'$data[trackid]'),
array('header'=>'Status','name'=>'Status','value'=>'$data[status]'),
),
答案 0 :(得分:1)
您必须正确指定name
每列的CGridView
。在您的示例代码中,它不正确,您使用了'name'=>'Case'
,而它应该是'name'=>'caseid'
,即name
的值应为完全值<您在sql中指定的strong>别名。
更新
另请注意,如果您没有进行任何格式化或修改从db检索的值,则不需要value
属性。 name
属性将负责从db结果集中获取正确的值。 header
将负责显示列标题名称,在您的情况下为Case
。
示例:
'columns'=>array(
array('header'=>'Case','name'=>'caseid'), // 'value'=>'$data[caseid]'),
array('header'=>'Track','name'=>'trackid'), // 'value'=>'$data[trackid]'),
array('header'=>'Status','name'=>'status'), // 'value'=>'$data[status]'),
),
要处理情境1和2,请在sql中使用别名,并在sort
的{{1}}数组中以及attributes
数组中使用这些别名的值
Sql示例:
name
数据提供程序:
select t.trackname as some_alias ...
CGridView:
'sort'=>array(
'attributes'=>array(
'some_alias',
// ... more attributes ...
),
// ... more options ...
),
因此,当您排序时,生成的查询将类似于:'columns'=>array(
array(
'header'=>'Some Header Name',
'name'=>'some_alias',
'value'=>'$data["some_alias"]' // as mentioned above this is unnecessary if you are not modifying the value
)
)
,这非常好。