Yii,CsqlDataProvider中的排序和列名称

时间:2012-12-02 11:46:07

标签: php yii

我曾尝试将cgridview与csqldataprovider一起使用。

  1. 我的sql查询从不同的表中获取数据。我在查询中使用了别名。所以在gridview中,当我点击标题值时,它需要列名进行排序。即,column name = Track它会使用... order by Track创建查询,但实际上应该创建...order by t.trackname
  2. 为了增加更多的复杂性,我在表中将列名作为表名。例如,在具有表名Store和列名trackid的同一个数据库中,我在同一个数据库中有另一个表,表名为trackid
  3. 我查了solution。在cgridview中,当我指定我的列属性时,它不会变为可排序(没有锚标签)。没有列属性,它是可排序的。
  4. 在控制器文件中,

    $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]'),
    ),
    

1 个答案:

答案 0 :(得分:1)

您必须正确指定name每列的CGridView。在您的示例代码中,它不正确,您使用了'name'=>'Case',而它应该是'name'=>'caseid',即name的值应为完全值<您在sql中指定的strong>别名。

更新

  1. 另请注意,如果您没有进行任何格式化或修改从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]'),
    ),
    
  2. 要处理情境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 ) ) ,这非常好。