cleric.test/models/UserSearch.php

101 lines
3.4 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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');
}
}
}