从cgridview中的函数中排序值

时间:2014-04-21 08:15:02

标签: php sorting yii cgridview

我有一个表,其中一列具有函数

的值
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'camera-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    array(
        'name'=>'location', 
        'header'=>'Location', 
        'value'=>'$data->location->name'
    ),
    array(
        'header'=>'Last Date',
        'value'=>'$data->myfunction($data->location->name)'
    ),
),)); ?>

我的问题是:

  1. 如何对列上次日期进行排序?
  2. 最后日期为空的可能性。那么,如果我想显示Last Date不是null的行,我想要做什么?
  3. 之前感谢:)

3 个答案:

答案 0 :(得分:1)

排序将如下所示:

    $sort = new CSort;
    $criteria->with = array(
        'location'
    );

    /* Sort criteria */
    $sort->attributes = array(
        'col_name'=>array(
            'asc'=>"location.date asc",
            'desc'=>"location.date desc",
        ),
        '*',
    );

    /* Default Sort Order*/
    $sort->defaultOrder= array(
        'col_name'=>CSort::SORT_ASC,
    );

    return new CActiveDataProvider($this, array(
        'pagination'=>array('pageSize'=>20),
        'criteria'=>$criteria,
        'sort'=>$sort,
    ));

并且您需要检查行值:

  'value'=>'$data->location ? $data->myfunction($data->location->name) : ""'

如果您在数据库中没有任何可以订购的列,则应从数据库中选择所有记录,然后手动对它们进行排序并放入CArrayDataProvider。

答案 1 :(得分:0)

正如@Alex所说,没有编辑数据库的唯一解决方案是从数据库中读取所有记录,将您的函数应用于每个模型,然后手动对它们进行排序。这不仅是一个大表的内存耗费,它也非常低效,因为a)如果使用分页,你将丢弃数据库中的大部分记录,b)你的自定义排序方法很可能比你的慢数据库&#39; S

根据您提供的信息,我的解决方案是在您的表格中添加一个附加字段,并将其设置为$data->myfunction($data->location->name)'的结果。设置CActiveDataProvider的{​​{1}}可用于提供defaultOrder

答案 2 :(得分:0)

最后,我找到了这个解决方案。 总的来说,我必须将我的自定义变量作为SQL查询。因此,我可以像数据库中的其他变量一样对自定义变量进行排序或搜索。

在mymodel中,

  1. 声明新变量 public $LAST_DATE;

  2. 添加$ criteria

  3. $criteria->select = array('*','COALESCE(location.name, \'\') AS LAST_DATE'); $criteria->order = 'LAST_DATE DESC'; return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'sort'=>array( 'defaultOrder'=>'LAST_DATE DESC', 'attributes' => array( 'LAST_DATE'=>array( 'asc'=>'COALESCE(location.name, \'\')', 'desc'=>'COALESCE(location.name, \'\') DESC', ), '*', ), ),