Я знаю, что это общий вопрос, но я получаю конкретную ошибку о неприсоединенной таблице.
Моя основная модель (группа) имеет такое соотношение (1: 1):
return array(
'groupType'=>array(self::BELONGS_TO, 'GroupType', 'groupTypeId','order'=>'name ASC');
Как вы можете видеть, я попытался установить атрибуты порядка, которые не работают.
Как вы можете себе представить, мой другой модуль, GroupType, имеет атрибут name.
В виде сетки модель отношения печатается хорошо, просто используя имя отношения:
array(
'name'=>'groupType',
'value'=>'$data->groupType->name'
),
Автозагрузка работает нормально в GridView.
К сожалению, столбец не сортируется. Поэтому я поместил параметр CSort в DataProvider, предоставленный в методе поиска, как показано ниже:
$sort = new CSort();
$sort->defaultOrder = 'id asc';
$sort->attributes = array(
'groupType'=>array(
'asc'=>'groupType.name asc',
'desc'=>'groupType.name desc'
),
'description'=>array(
'asc'=>'t.description asc',
'desc'=>'t.description desc'
),
'name'=>array(
'asc'=>'t.name asc',
'desc'=>'t.name desc'
),
'*');
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>$sort
));
Упорядочивание по описанию и названию (атрибут группы) работает нормально. Когда я пытался заказать по groupType, я получаю это просто ошибка:
SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'groupType.id' in 'order clause'. The SQL statement executed was: SELECT * FROM `cprol_groups` `t` ORDER BY groupType.idname asc LIMIT 20
Как вы можете видеть, фреймворк не присоединяется к моей связанной таблице. И в этом случае, какой псевдоним я должен использовать из-за того же имени свойства?
Спасибо за любой совет!
Я решил форсировать соединение.
В критериях я вынужден присоединиться:
$criteria->join = 'join '.GroupType::model()->tableName().' gt on gt.id = t.groupTypeId';
или используя оператор -> with:
$criteria->with = 'groupType';
удаление порядка по умолчанию в отношении и добавление псевдонима:
return array('groupType'=>array(self::BELONGS_TO, 'GroupType', 'groupTypeId','alias'=>'gt'));
так что вы можете заказать по полю отношения:
$sort = new CSort();
$sort->defaultOrder = 'gt.name asc';
$sort->attributes = array(
'groupTypeId'=>array(
'asc'=>'gt.name asc',
'desc'=>'gt.name desc'
),
Других решений пока нет …