我想在CGridView中显示一个可过滤且可排序的行号列,但我得到的只是一个空的可排序(可点击的标题)和可过滤的(它有过滤文本框那里) )专栏。
在模型(ActiveRecord)类中,我添加了一个新的公共属性:
public $number;
在我添加的rules()函数中:
public function rules()
{
return array(
...
...
array('
...
...
number,
',
'safe',
'on'=>'search'
),
);
}
在search()函数上,我还添加了:
public function search()
{
$criteria=new CDbCriteria;
...
...
$number_select = '(
select count(*)
from tbl_mytable as k
where k.id <= t.id
)';
$criteria->select = array(
$number_select . ' as number',
't.*',
);
...
...
$criteria->compare($number_select, $this->number,true);
$sort = new CSort;
$sort->attributes = array(
'*',
...
...
'number'=>array(),
);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>$sort,
));
}
我已经成功使用这种方法添加其他列。
由于缺乏sqlite查询的技能和知识,我怀疑这个问题的原因是$criteria->select
中的查询。
我希望有人能帮助我解决这个问题。
答案 0 :(得分:0)
尝试将该属性添加到CActiveRecord.attributeNames
:
public function attributeNames()
{
return array_merge(parent::attributeNames(), array('number'));
}
答案 1 :(得分:0)
在编辑了我的问题后,我编辑了一段时间奇迹般地成为答案的代码。
只需从select语句
中删除表别名即可
原始(不工作)代码:
$number_select = '(
select count(*)
from tbl_mytable as k
where k.id <= t.id
)';
删除表别名后的新(工作)代码:
$number_select = '(
select count(*)
from tbl_mytable
where tbl_mytable.id <= t.id
)';
虽然我的问题是关于yii与sqlite数据库,但由于这是非常标准的查询,我认为这个解决方案也适用于yii与mysql数据库