Ну, это заняло у меня некоторое время, но я наконец понял это..что-то вроде этого:
public function search() {
$criteria=new CDbCriteria;
$criteria->select = 't.*, IFNULL( count(article.id), 0) as articleCount';
$criteria->join = 'LEFT JOIN article ON article.userid = t.id';
$criteria->group = 't.id';
// other $criteria->compare conditions
$sort = new CSort();
$sort->attributes = array(
'articleCount'=>array(
'asc'=>'articleCountASC',
'desc'=>'articleCountDESC',
),
'*', // add all of the other columns as sortable
);
return new CActiveDataProvider(get_class($this), array(
'criteria'=>$criteria,
'sort'=>$sort,
'pagination'=> array(
'pageSize'=>20,
),
));
}
Затем в вашем представлении, где вы выводите CGridView, сделайте это так:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'columns'=>array(
'articleCount',
// other columns here
)
)); ?>
Это работает, я проверял это (хотя я не использовалточно такие же имена, как 'article', но основная идея должна работать :) Я добавил некоторые бонусные функции, чтобы они работали лучше (например, волшебство IFNULL), но большая часть заслуг принадлежит этому сообщению на форуме Yii:
http://www.yiiframework.com/forum/index.php?/topic/7061-csort-and-selfstat-to-sort-by-count/
Надеюсь, это поможет!Они должны добавить лучшую поддержку для этого, так что вам не нужно делать эти сложные инструкции SELECT.Похоже, что-то, что должно «просто работать», я бы подал запрос на «улучшение» в Yii bug tracker .