CArrayDataProvider и сортировка по связанной таблице

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

CArrayDataProvider и сортировка по связанной таблице

Сообщение rak »

Возможно баг, возможно я чтото делаю не так:
Yii 1.1.6
PHP 5.3
Есть модели User и Profile.

Код: Выделить всё

public function relations() {       
        return array(
            'profile' => array(self::HAS_ONE, 'Profile', 'user_id'),
        );
    }
 
Делаю выборку пользователей с сортировкой по полю из модели Profile, запихиваю все это дело в CArrayDataProvider

Код: Выделить всё

$criteria = new CDbCriteria();
$criteria->with = array('profile');
$models = User::model()->findAll($criteria);
 

Код: Выделить всё

 $dataProvider = new CArrayDataProvider($models, array(
            'keyField' => 'id',
            'sort' => array(
                'attributes' => array(
                    'name' => array(
                        'asc'=>'profile.user_name',
                        'desc'=>'profile.user_name DESC',
                        'label' => Yii::t('UserModule.frontend', 'Name')
                    ),                 
                ),               
            ),
        ));
 
И при сортировке по данному полю получаю
Property "User.profile.user_name" is not defined.
/home/rak/Work/localhost/root/htdocs/framework/db/ar/CActiveRecord.php(110)
Причем без сортировки все эти поля отображаются(ну т.е. $data->profile->user_name), сортировка по полям модели User также работает нормально
Stack Trace

#0    
– /home/rak/Work/localhost/root/htdocs/framework/db/ar/CActiveRecord.php(110): CComponent->__get("profile.user_name")
105         else if(isset($this->_related[$name]))
106             return $this->_related[$name];
107         else if(isset($this->getMetaData()->relations[$name]))
108             return $this->getRelated($name);
109         else
110             return parent::__get($name);
111     }
112 
113     /**
114      * PHP setter magic method.
115      * This method is overridden so that AR attributes can be accessed like properties.
#1    
–  //home/rak/Work/localhost/root/htdocs/framework/web/CArrayDataProvider.php(118): CActiveRecord->__get("profile.user_name")
113         $dummy=array();
114         foreach($directions as $name=>$descending)
115         {
116             $column=array();
117             foreach($this->rawData as $index=>$data)
118                 $column[$index]=is_object($data) ? $data->$name : $data[$name];
119             $args[]=&$column;
120             $dummy[]=&$column;
121             unset($column);
122             $direction=$descending ? SORT_DESC : SORT_ASC;
123             $args[]=&$direction;
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CArrayDataProvider и сортировка по связанной таблице

Сообщение samdark »

А если заменить 'asc'=>'profile.user_name' на 'asc'=>'user_name'?
Ответить