@Daaeev

Как правильно построить запрос на получение данных в Yii2?

Есть две таблицы - post и category.
Имеется связь OneToMany [category.id -> post.category_id], то есть у нескольких постов может быть одна категория, а у одной категории может быть несколько постов.

Мне нужно получить 4 категории и 4 связанных с этой категорией поста. Посты отсортированы по убыванию количества просмотров(post.views). Категории отсортированы по убыванию суммы просмотров постов данной категории.

Я понятия не имею, как это сделать. Всё что имею:
$categories = Category::find()
            ->joinWith('posts p')
            ->where(['=', 'p.status', Post::STATUS_PUBLISH])
            ->limit(4)
            ->all();

Код связи:
public function getPosts()
    {
        return $this->hasMany(Post::class, ['category_id' => 'id']);
    }

Помогите, пожалуйста!
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@PiloTeZ
...
Должно помочь следующее, но с условием денормализации БД. То есть сумма просмотров постов хранятся как в категории, так и в посте.
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();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы