Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search Yii从函数中搜索_Search_Yii_Cgridview - Fatal编程技术网

Search Yii从函数中搜索

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,

我有一个CGridView,我想在其中搜索。问题是我有一个列,它被模型中的一个函数修改。所有内容都从search.php视图开始,该视图包含如下所示的cgridview:

$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,并在其他型号中使用它进行搜索。感谢您的帮助,我将查看它并阅读源代码!