Поиск в столбце модели BELONGS_TO с помощью CGridView, Yii - PullRequest
4 голосов
/ 31 января 2011

У меня есть виджет CGridView для модели урока

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

... и урок имеет отношение к модели пользователя:

'user' => array(self::BELONGS_TO, 'User', 'user_id'),

... а в CGridView есть столбец с фамилией пользователя из описанной выше модели BELONGS_TO

'columns'=>array(
        ...
        array(
            'name' => 'user',
            'header'=>'Teacher',
            'value' => '$data->user->lastname',
        ),

Итак, я не могу найти простой поиск в CGridView в этом столбце, но он мне нужен.

Как искать в '$ data-> user-> secondname' с CGridView?

Я думаю, что я должен расширить метод поиска в модели урока, но как?

Теперь это выглядит так:

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,
    ));
}

1 Ответ

8 голосов
/ 01 февраля 2011

Это должно работать, добавьте его в критерии поиска в методе search ():

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

Это то, что я делаю, хотя:

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, он найдет пользователя по его user_id - функции поиска по умолчанию ().

ПРИМЕЧАНИЕ. Это включит фильтрацию, но все равно будет сортировать по идентификатору.Вам нужно будет реализовать что-то дополнительное, чтобы заставить сортировку работать.

Конечно, есть и другие способы сделать это, но я так и делаю.Я подозреваю, что есть «право» сделать это, используя отношение, но моя техника работает безупречно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...