У меня есть следующие отношения в моей модели User:
return array(
'images' => array(self::HAS_MANY, 'Images', 'owner_id'),
'imagesCount' => array(self::STAT, 'Images', 'owner_id', 'condition' => 'approved = 1'),
'server' => array(self::BELONGS_TO, 'Servers', 'server_id'),
);
Таблица пользователей связана с таблицей изображений через owner_id.
Модель изображений имеет отношения как:
return array(
'imageVotes' => array(self::HAS_MANY, 'ImageVotes', 'image_id'),
'imageTags' => array(self::HAS_MANY, 'ImageTags', 'image_id'),
'owner' => array(self::BELONGS_TO, 'Users', 'owner_id'),
'server' => array(self::BELONGS_TO, 'Servers', 'server_id'),
);
Я хочу посчитать лучших авторов на основе наибольшего количества загруженных ими изображений.
Каков порядок сортировки CDbCriteria или CActiveDataProvider?
Вы должны использовать виртуальные атрибуты в своем роде Объект CActiveDataProvider
Ваш провайдер данных должен быть примерно таким
$activeDataProvider = CActiveDataProvider($userModel, array(
'criteria' => $criteriaObject,
'sort' => array(
'defaultOrder'=>array('imgCount'),
'attributes'=>array('imgCount'=>
array('asc'=>'(SELECT COUNT(id) FROM images WHERE owner_id = t.id)', // t.id or modelName.id
'desc'=>'(SELECT COUNT(id) FROM images WHERE owner_id = t.id) DESC',
'label'=>'Images Count',
'default'=>'desc',
)),
)
));
}
См см CSort
документация, чтобы понять, как виртуальные атрибуты и реляционные атрибуты могут быть использованы в качестве элементов сортировки в вашем DataProviders
Других решений пока нет …