CGridView Сортировка с использованием сортировки реляционных таблиц по параметру relaton Id

77
7

У меня проблема в CGrid при сортировке реляционных данных с использованием реляционной модели на странице ''.

Кратко мой сценарий:

У меня есть model: Entities=> id,username пользователя model: Entities=> id,username И профиль Model: Entities=> id, firstname,lastname, user_id, т.д.

Я хочу перечислить profile mode l и username из user model в CGrid, чтобы сортировка и поиск перм хорошо. В моем случае сортировка username выполняется user_id не по username. Я хочу найти его по username, поэтому я делаю следующее:

Действие моего контроллера:

$model = new Profile('search');
$model -> unsetAttributes();// clear any default values
if (isset($_GET['Profile']))
$model -> attributes = $_GET['Profile'];

$this -> render('MyPage', array('model' => $model ));

Мое отношение к модели:

public function relations() {
// NOTE: you may need to adjust the relation name and the related
// class name the relations automatically generated below.

return array(
'user' => array(self::BELONGS_TO, 'user', 'user_id'),);
}

Типовые правила:

array( 'xxx,yyy,user_name', 'safe', 'on'=>'search' ),

И функция поиска модели

if(!empty($this->user_id)){
$criteria->with='user';
$criteria->order = ::app()->request->getParam('sort');// 'username ASC'
}

$criteria -> compare('user.username', $this->user_id, true);

мой

$this->widget('zii.widgets.grid.CGrid', array(
'id'=>'profile-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
array('name'=>'user_id',
'header'=>User::model()->getAttributeLabel('username'),
'value' =>'$data->getRelated(\'user\')->username',
'type'=>'raw',
'htmlOptions'=>array('style'=>'text-align: center'),),
---------------

Во время сортировки сортировка работает отлично, но сортировка выполняется на основе user_id не по username. Все, что мне не хватает, чтобы это сделать. Пожалуйста, предложите.

Ссылка: здесь (я также пробовал, объявляя публичную переменную как предложение в ссылке, но bot workingg.)

Изменение: после устранения проблемы. Спасибо за эту ссылку.

спросил(а) 2021-01-25T15:29:37+03:00 4 месяца, 4 недели назад
1
Решение
90

Ну, вики-страница, которую вы нашли, действительно хорошее начало...

Вот альтернативный способ для этого:

В вашей модели профиля:

// private username attribute, will be used on search
private $_username;

public function rules()
{
return array(
// .....
array('username', 'safe', 'on'=>'search'),
// .....
);
}

public function getUsername()
{
// return private attribute on search
if ($this->scenario=='search')
return $this->_username;

// else return username
if (isset($this->user_id)) && is_object($this->user))
return $this->user->username;
}

public function setUsername($value)
{
// set private attribute for search
$this->_username = $value;
}

public function search()
{
// .....
$criteria->with = 'user';
$criteria->compare('user.username', $this->username, true);
// .....

return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'attributes'=>array(
'username'=>array('asc'=>'user.username', 'desc'=>'user.username DESC'),
'*',
),
),
));
}

И, на ваш взгляд, вы должны просто попробовать:

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'profile-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
// .....
'username',
// .....
),
);

ответил(а) 2021-01-25T15:29:37+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема