Есть такие таблицы:
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']);
}
...
}
Также понимаю криворукость метода getRate, надо как то одним запросом результат доставать, но лучшего решения я пока не знаю.
Заранее благодарю за любую помощь