AlexBraun87
@AlexBraun87

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

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

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

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

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

Делаю это так в модели:

В виджете:
$models = Yii::$app->db->cache(function (Connection $db) {
    return 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])
        ->orderBy([
                new Expression(sprintf("FIELD(cat.id, %s)", implode(",", [1,2,3,4,5])))
        ])
        ->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 и так далее.

Если в модель категории добавляю ещё одну функцию в которой указываю limit(10), то всё начинает работать как надо, но запросов становится на 35-55 больше т.к. функция дёргает это при каждом проходе foreach.
public function getNewsCategory($items = 10)
    {
        return $this->getNews()->limit($items)->all();
    }


Заранее спасибо за ответы и советы.
  • Вопрос задан
  • 213 просмотров
Решения вопроса 1
SamDark
@SamDark
Yii2 core team
$sql = 'Select ........';
$model = YourModel::findBySql($sql)->all();


Через relation нормально не выйдет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@KingstonKMS
Думаю, что вам необходимо разделить запрос следующим образом:
1. Выбрать id категорий.
2. Выбрать новости для каждой категории, со связями к комментариям и картинкам.
А то, что запросов получается 35-55 это не много, надо смотреть что они из себя представляют.
Посмотрите, какой формат данных получается при выполнении запроса:
News::find()->where(['category_id' => $id])->with('comments')->with('photos')->asArray()->limit(10)->all()
Ответ написан
Ваш ответ на вопрос

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

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