Пожалуйста, учтите следующее:
class User extends CActiveRecord { ... public function relations() { return array( ... 'articleCount' => array(self::STAT, 'Article', 'userid'), ... ); } ... }
Теперь мне нужно создать $dataProvider = new CActiveDataProvider(...)
для подачи виджета CListView
к которому я хочу добавить articleCount
в свойство sortableAttributes
чтобы я мог сортировать записи пользователя в соответствии с количеством статей, которые пользователь является автором для.
Каков наиболее удобный метод? каковы другие альтернативы?
Ну, это заняло у меня некоторое время, но я, наконец, понял это. 😉
Во-первых, убедитесь, что у вас все еще есть те же отношения STAT, о которых вы говорите в своем вопросе.
Затем в методе search (), где вы создаете свой CDbCriteria для CActiveDataProvider, сделайте что-то вроде этого:
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, ), )); }
по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 ) )); ?>
Это работает, я тестировал его (хотя я не использовал точно такие же имена, как «статья», но основная идея должна работать 🙂 Я добавил некоторые бонусные функции, чтобы он работал лучше (например, маска IFNULL), но большая часть кредит идет на этот пост форума Yii:
http://www.yiiframework.com/forum/index.php?/topic/7061-csort-and-selfstat-to-sort-by-count/
Надеюсь, это поможет! Они должны добавить дополнительную поддержку для этого, поэтому вам не нужно делать эти сложные инструкции SELECT. Кажется, что-то, что должно «просто работать», я бы подал запрос «улучшения» в трекер Yii .