使用CGridView,Yii在BELONGS_TO模型列中搜索

Kir*_*Kir 4 search model yii

我有一个用于Lesson模型的CGridView小部件

$this->widget('zii.widgets.grid.CGridView', array(
     'id'=>'lesson-grid',
     'dataProvider'=>$model->search(),
     'filter'=>$model,
Run Code Online (Sandbox Code Playgroud)

...和Lesson与User模型有关:

'user' => array(self::BELONGS_TO, 'User', 'user_id'),
Run Code Online (Sandbox Code Playgroud)

...并且CGridView有一个列,其中包含上述BELONGS_TO模型中用户的姓氏

'columns'=>array(
        ...
        array(
            'name' => 'user',
            'header'=>'Teacher',
            'value' => '$data->user->lastname',
        ),
Run Code Online (Sandbox Code Playgroud)

所以,我不能在本专栏中用CGridView进行搜索,但我需要它.

如何使用CGridView搜索'$ data-> user-> secondname'?

我认为我应该在Lesson模型中扩展搜索方法,但是如何?

现在它看起来像这样:

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,
    ));
}
Run Code Online (Sandbox Code Playgroud)

tha*_*smt 8

这应该工作,将其添加到search()方法中的搜索条件:

$criteria->with[]='user';
$criteria->addSearchCondition("user.secondname",$this->user_id);
Run Code Online (Sandbox Code Playgroud)

这是我的工作:

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);
Run Code Online (Sandbox Code Playgroud)

这是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
    ),
Run Code Online (Sandbox Code Playgroud)

这是一个有趣的小技巧:如果搜索项是字符串而不是intval(),它将通过"user"关系按其第二个名称搜索用户.但是如果输入user_id,它将通过user_id找到用户 - 默认的search()功能.

注意:这将启用过滤,但仍将根据ID进行排序.您需要实现一些额外的操作才能使分类工作.

肯定有其他方法可以做到这一点,但这就是我的方法.我怀疑使用这种关系有一个"正确"的做法,但我的技术很有效.