我有一个表,其中一列具有函数
的值<?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)'
),
),)); ?>
我的问题是:
之前感谢:)
答案 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中,
声明新变量
public $LAST_DATE;
添加$ criteria
$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',
),
'*',
),
),