101 lines
3.4 KiB
PHP
101 lines
3.4 KiB
PHP
<?php
|
||
|
||
namespace app\models;
|
||
|
||
use Yii;
|
||
use yii\data\ActiveDataProvider;
|
||
|
||
class UserSearch extends User
|
||
{
|
||
|
||
public $name;
|
||
public $sort_comment_count;
|
||
public $sort_subscribers_count;
|
||
public $sort_post_count;
|
||
|
||
/**
|
||
* {@inheritDoc}
|
||
*/
|
||
public function rules()
|
||
{
|
||
return [
|
||
[['name'], 'string'],
|
||
[['sort_comment_count', 'sort_subscribers_count', 'sort_post_count'], 'in', 'range' => [ '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');
|
||
}
|
||
}
|
||
} |