Как вывести из связи только последние 10 записей через limit?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
tomclancys
Сообщения: 3
Зарегистрирован: 2020.06.05, 07:07

Как вывести из связи только последние 10 записей через limit?

Сообщение tomclancys »

Здравствуйте.

Не могу решить следующий вопрос. Есть модель со связью.
Необходимо вывести в виджете только по 10 последних записей из связи.

Пример:
1. Категории новостей, 5 штук
2. Новости в виде связи к категории(нужно только последние 10 новостей с сортировкой по ID)
2.1. Комментарии к новости в виде связи к новости. Прописано в модели новости.
2.2. Картинки новости в виде связи к новости. Прописано в модели новости.

Необходимо при выводе категорий вывести только последние 10 новостей из связи.

В виджете:

Код: Выделить всё

$models = Categories::find()
                ->alias('cat')
                ->select('cat.id, cat.name, cat.alias, cat.status')
                ->with('news')
                ->where(['cat.id' => [1,2,3,4,5])
                ->andWhere('cat.status = :cat_status', ['cat_status' => 1])
                ->all();
// Ниже вызываю рендер
Делаю связь так в модели:

Код: Выделить всё

public function getNews()
{
     return $this->hasMany(News::className(), ['category_id' => 'id'])
          ->alias('new')
          ->select('new.*')
          ->with(['comments, 'photos',])
          ->where('new.status != :new_status', ['new_status' => 9])
          ->orderBy(['new.id' => SORT_DESC])
          ->limit(10);
}
В view вывожу всё это так:

Код: Выделить всё

<?php foreach($model_category->news as $key => $item) : ?>
     // Выводим новости категории и связанные данные для них
<?php endforeach; ?>
Это работает, но не работает параметр limit 10 в связи т.к. он действует на общее количество новостей которое выводится, а не для каждой категории как хотелось бы. В итоге получаем что в первой категории 3 новости, во второй 5 и так далее и в остальных от 0 до 2 и в сумме 10 новостей.

Если в модель категории добавляю ещё одну функцию в которой указываю limit(10), то всё начинает работать как надо, но запросов становится на 35-55 больше т.к. функция дёргает это при каждом проходе foreach.

Код: Выделить всё

public function getNewsCategory($items = 10)
{
     return $this->getNews()->limit($items)->all();
}
Заранее спасибо за ответы и советы.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Как вывести из связи только последние 10 записей через limit?

Сообщение maleks »

Поищите по выражению "sql select top n records for each group", в первом же со stackoverflow есть варианты

Плюс
https://sqlinfo.ru/articles/info/45.html
Ответить