Search 使用CGridView,Yii在模型列中搜索
我有一个用于课程模型的CGridView小部件Search 使用CGridView,Yii在模型列中搜索,search,model,yii,Search,Model,Yii,我有一个用于课程模型的CGridView小部件 $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'lesson-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 。。。课程与用户模型有关: 'user' => array(self::BELONGS_TO, 'User', 'user_id'),
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'lesson-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
。。。课程与用户模型有关:
'user' => array(self::BELONGS_TO, 'User', 'user_id'),
。。。CGridView有一个列,其中包含上述模型中用户的姓氏
'columns'=>array(
...
array(
'name' => 'user',
'header'=>'Teacher',
'value' => '$data->user->lastname',
),
因此,我无法在本专栏中使用CGridView进行搜索,但我需要它
如何使用CGridView在“$data->user->secondname”中搜索
我认为我应该在课程模型中扩展搜索方法,但如何扩展呢
现在看起来是这样的:
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('student',$this->student,true);
$criteria->compare('comment',$this->comment,true);
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
));
}
如果可以,请将其添加到search()方法中的搜索条件中: 我就是这么做的:
if(!intval($this->user_id) && is_string($this->user_id) && strlen($this->user_id) > 0) {
$criteria->with[]='user';
$criteria->addSearchCondition("user.secondname",$this->user_id);
} else
$criteria->compare('t.user_id',$this->user_id);
以下是CGridView的定义:
'columns'=>array(
...
array(
'name' => 'user_id',
'header'=>'User',
'sortable'=>false, // since it would still be sorting based on ID
// 'value' => '$data->user->lastname', // basic version
'value'=>'CHtml::link((isset($data->user))?$data->user->username:$data->user_id,array("user/view","id"=>$data->user_id))', // link version
),
这是一个有趣的小技巧:如果搜索词是字符串而不是intval(),它将通过“user”关系按用户的第二个名称搜索用户。但是如果您输入一个用户id,它将根据用户的用户id(默认的search()功能)查找该用户
注意:这将启用筛选,但仍将基于ID进行排序。您需要实现一些附加功能才能使排序正常工作
当然还有其他方法可以做到这一点,但我就是这样做的。我怀疑使用关系做这件事是“正确的”,但我的技术非常有效。Update:我浪费了很多时间。。。如果需要使用LIKE来比较字段,只需像这样添加true:$criteria->compare(“user.secondname”,$this->user\u id,true);
'columns'=>array(
...
array(
'name' => 'user_id',
'header'=>'User',
'sortable'=>false, // since it would still be sorting based on ID
// 'value' => '$data->user->lastname', // basic version
'value'=>'CHtml::link((isset($data->user))?$data->user->username:$data->user_id,array("user/view","id"=>$data->user_id))', // link version
),