Должно помочь следующее, но с условием денормализации БД. То есть сумма просмотров постов хранятся как в категории, так и в посте.
https://www.yiiframework.com/doc/guide/2.0/ru/db-a...
$categories = Category::find()
->with([
'posts' => function ($query) {
$query->limit(4)->orderBy(['views' => SORT_DESC]);
},
])
->orderBy(['views' => SORT_DESC])
->all();
UPD:
Черновой вариант без денормализации.
Решение:
- категории сортируются используя JOIN к постам, SUM и группировку по categories.id
- посты получаются отдельным запросом через связи Yii
$categories = Category::find()
->joinWith('posts')
->select('*', 'SUM(posts.views) as category_posts_views')
->with([
'posts' => function ($query) {
$query->limit(4)->orderBy(['views' => SORT_DESC]);
},
])
->groupBy('categories.id')
->orderBy(['category_posts_views' => SORT_DESC])
->all();