@phpForeve

Возможно ли сделать пагинацию данных, которые я подключил через связь hasMany?

У меня есть 3 таблицы . "Дома", "Новости" и "Новости для дома", которая связывает нужные новости с определенным домом.
public function getNews(){
        return $this->hasMany(News::className(), ['id' => 'news_id'])
        ->viaTable('home_news', ['home_id' => 'id']); 
    }


Пагинацию делаю следующим образом. Количество страниц считается правильно, но вот контент на любой из страниц отображается весь. Как исправить?
$home = $this->findModel($id);
        $pages = new Pagination(['totalCount' => count($home->news), 'pageSize' => Settings::getValue('pageSizeNewsInHome'), 'pageSizeParam' => false]);
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Контролер
public function actionView($id)
    {
$model = Home::findOne($id);
        $dataProvider = new ActiveDataProvider([
            'query' => $model->getNews(),
        ]);
        return $this->render('view', [
            'model' => $model,
            'dataProvider' => $dataProvider,
        ]);
    }

вьюшка:
echo ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '_one_news_page_template',
]);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mitaichik
@mitaichik
Pagination отвечает только за расчет кол-ва необходимых страниц, текущую страницу, кол-ва необходимых элементов на странице и т.п. К данным он никакого отношения не имеет.

Здесь нужно пользоваться ActiveDataProvider. Он соединяет в себе и пагинацию, и выборку данных, и сортировку.

И да, count($home->news) - вы понимаете насколько это неоптимальная конструкция? В общем, юзайте ActiveDataProvider - он все сделает правильно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы