Search Yii从函数中搜索
我有一个CGridView,我想在其中搜索。问题是我有一个列,它被模型中的一个函数修改。所有内容都从search.php视图开始,该视图包含如下所示的cgridview:Search Yii从函数中搜索,search,yii,cgridview,Search,Yii,Cgridview,我有一个CGridView,我想在其中搜索。问题是我有一个列,它被模型中的一个函数修改。所有内容都从search.php视图开始,该视图包含如下所示的cgridview: $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'grid-demande', 'summaryText'=>'', 'dataProvider'=>$model->search(), //'filter'=>$model,
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'grid-demande',
'summaryText'=>'',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'cssFile'=>Yii::app()->request->baseUrl."/css/my_gridview.css",
'columns'=>array
(
array(
'name'=>'id_post',
'htmlOptions'=>array('width'=>'16%'),
),
array(
'name'=>'fk_authorid',
'htmlOptions'=>array('width'=>'16%'),
'value'=>array($this,'renderNameDmd'),
),
)
如您所见,调用函数renderNameDmd来呈现作者的姓名。此函数在我的模型中,但从控制器调用:
protected function renderNameDmd($data,$row)
{
$model=$this->loadModelDmd($data->id_post);
return $model->getChAuthor();
}
在模型类中,我调用:
public function getChAuthor(){
$modelUsr=TUsers::model()->findByPk($this->fk_authorid);
return $this->fk_authorid.', '.$modelUsr->ch_completeName;
}
一切都很适合展示。我的主要问题是,我想通过这个cgridview进行搜索,但无法使用显示的值进行搜索。以下是我的模型中包含的搜索功能:
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
//more criterias
$criteria->compare('fk_cip',$this->fk_cip,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
目前,我已经尝试了一些方法,但是没有任何效果,所以我将代码重置为最初的状态。现在,如果我在cgridview中搜索,我只能使用authord进行过滤,而不能使用我编写的完整列格式。例如:
对于如下所示的行:
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'grid-demande',
'summaryText'=>'',
'dataProvider'=>$model->search(),
//'filter'=>$model,
'cssFile'=>Yii::app()->request->baseUrl."/css/my_gridview.css",
'columns'=>array
(
array(
'name'=>'id_post',
'htmlOptions'=>array('width'=>'16%'),
),
array(
'name'=>'fk_authorid',
'htmlOptions'=>array('width'=>'16%'),
'value'=>array($this,'renderNameDmd'),
),
)
3231,无名氏
我只能通过以下搜索:
3231
我想搜索通过函数创建的行。
谢谢你的帮助 嗯,Yii对于此类功能非常方便,但是您应该首先重写您的模型以使用关系 在您的模型中:
// this attribute will be used in search function
private $_authorName;
public function rules()
{
return array (
.....
array('authorName', 'safe', 'on'=>'search'),
.....
);
}
public function relations()
{
return array(
.....
'author' => array(self::BELONGS_TO, 'TUsers', 'fk_authorid'),
.....
);
}
// authorName getter
public function getAuthorName()
{
if ($this->scenario=='search')
return $this->_authorName;
return $this->fk_authorid.', '.$this->author->ch_completeName;
}
// authorName setter
public function setAuthorName($authorName) {
$this->_authorName = $authorName;
}
public function search()
{
$criteria=new CDbCriteria;
.....
// search author name ?
if ($this->authorName!==null)
{
$criteria->with = array('author');
$criteria->compare('author.ch_completeName', $this->authorName, true);
}
.....
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
在CGridView中,您只需如下定义列:
array(
'name'=>'authorName',
'htmlOptions'=>array('width'=>'16%'),
),
你应该读到:
您不能搜索这样的列。问题是dataprovider构造查询并在sql中执行它。在db中没有该函数。要么在
save
函数中对数据库进行非规范化以保存名称,要么使用关系进行搜索(我不擅长这样做,因此无法停止)。这也是非常不完善的,因为它对每一行执行查询。还可以发布模型的关系
函数,这样我们可以检查关系是否正常。哦,好吧。。。我正在寻找一个替代我目前的解决方案,然后!关系搜索可以工作,但我不使用关系数据库,所以我不知道怎么做。或者,您可以搜索TUsers
,获取匹配的id,并在其他型号中使用它进行搜索。感谢您的帮助,我将查看它并阅读源代码!