Добрый вечер,
Есть такие таблицы:
users
----------------
id
name
----------------
departments
----------------
id
name
----------------
news
----------------
id
department_id
name
----------------
events
----------------
id
department_id
name
----------------
rating_departments
----------------
department_id
user_id
rate
----------------
Мне нужно сделать:
1) Вывод модели
Departments по рейтингу по убыванию
2) Вывод модели
Departments по убыванию кол-ва привязанных к нему новостей и событий. С учетом суммарного кол-ва и тех и тех.
Желательно скормить желаемую сортировку для
DepartmentsSearch класса или хотя бы для модели
Исходные модели:
class Departments extends ActiveRecord
{
...
public function getEvents()
{
return $this->hasMany(Events::className(), ['department_id' => 'id']);
}
public function getNews()
{
return $this->hasMany(News::className(), ['department_id' => 'id']);
}
public function getRatingSum()
{
$val = RatingDepartments::find()->andWhere([
'department_id' => $this->department_id,
])->sum('rate');
return $val ?? 0;
}
public function getRatingQty()
{
$val = RatingDepartments::find()->andWhere([
'department_id' => $this->department_id,
])->count();
return $val;
}
public function getRate()
{
$sum = $this->getRatingSum();
$qty = $this->getRatingQty();
if(!$qty)
return 0;
$rate = ceil($sum / $qty);
return $rate;
}
...
}
class RatingDepartments extends ActiveRecord
{
...
public function getUser()
{
return $this->hasOne(Users::className(), ['id' => 'user_id']);
}
public function getDepartment()
{
return $this->hasOne(Departments::className(), ['id' => 'department_id']);
}
...
}
class News extends ActiveRecord
{
...
public function getDepartment()
{
return $this->hasOne(Departments::className(), ['id' => 'department_id']);
}
...
}
class News extends ActiveRecord
{
...
public function getDepartment()
{
return $this->hasOne(Departments::className(), ['id' => 'department_id']);
}
...
}
class Events extends ActiveRecord
{
...
public function getDepartment()
{
return $this->hasOne(Departments::className(), ['id' => 'department_id']);
}
...
}
https://nix-tips.ru/yii2-sortirovka-i-filtr-gridvi... смотрел. Но этот вариант не совсем подходит, чую тут нужен какой то хитровыдуманный
SQL запрос.
Также понимаю криворукость метода
getRate, надо как то одним запросом результат доставать, но лучшего решения я пока не знаю.
Заранее благодарю за любую помощь