[ 'desc', 'asc' ]], [['sort_comment_count', 'sort_subscribers_count', 'sort_post_count'], 'onlyOneSort'], [['page'], 'integer'], [['page'], 'required'], ]; } public function onlyOneSort($attribute, $params) { $attributes = ['sort_comment_count', 'sort_subscribers_count', 'sort_post_count']; $oneSet = false; foreach ($attributes as $attribute) { if (isset($this->$attribute)) { if ($oneSet) { $this->addError($attribute, Yii::t('validation', 'only one sort is allowed')); return false; } $oneSet = true; } } } public function search($params) { $query = User::find(); $query->limit(100); $query->offset(((int) $this->page) * 100); /** * Впринципе можно наверное и просто query вернуть но это * на всякий чтобы можно было через какую нибудь вьюшку отобразить */ $provider = new ActiveDataProvider([ 'query' => $query ]); /** * Запрос скорее всего кривой, но это по большей части псевдокод * так что надеюсь простите если оно выглядит нелепо */ if (!($this->load($params)) && $this->validate()) { return $provider; } if ($this->name) { $query->andFilterWhere(['like', 'name', $this->name]); } if ($this->sort_comment_count === true) { $query->join('outer', 'comments', [ 'user.comment_id' => 'comments.id' ]); $query->orderBy([ 'COUNT(comment.id)' => $this->sort_comment_count ]); } if ($this->sort_post_count === true) { $query->join('outer', 'posts', [ 'posts.user_id' => 'user.id' ]); $query->orderBy([ 'COUNT(posts.id)' => $this->sort_post_count ]); } if ($this->sort_subscribers_count === true) { /** * Тут бы я вместо под запроса поставил как два джоина прежде чем пускать в прожакшн * но у меня сейчас недостаточно мозговых сил чтобы так сильно продумывать */ $query->join('outer', 'blogs', [ 'blogs.user_id' => 'user.id' ]); $query->orderBy([ 'IF(blogs.id, SELECT COUNT(*) FROM subscriptions s WHERE s.blog_id = blogs.id)' => $this->sort_subscribers_count ]); } if ( $this->sort_comment_count === true || $this->sort_post_count === true || $this->sort_subscribers_count === true ) { $query->groupBy('user.id'); } } }