@ZaurK

Как правильно совместить пагинацию с выборкой из базы?

Здравствуйте! Имеются две таблицы - album и photo, которые соединены по внешнему ключу и имеют связь "один ко многим". Задча в том, чтобы вывести альбомы с пагинацией, причем на обложку альбома должна выводиться последнее фото из этого альбома. На данном этапе возникла проблема с правильной формулировкой запроса и пагинацией.
public function actionGalleryall()
       {

         $this->layout = 'inner';
         $query = Album::find()->joinWith('photo')->orderBy('id')->all();
         // echo '<pre>';
         // print_r($query);
         // die();
         $countQuery = clone $query;
         $pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize'=>3]);
         $models = $query->offset($pages->offset)
          ->limit($pages->limit)
          ->all();

      return $this->render('albumsall', [
           'models' => $models,
           'pages' => $pages,
      ]);

       }

В этом коде возникает ошибка, ругается "__clone method called on non-object", в $query должен быть объект, а у меня благодаря "->all()" там вроде массив. Если же убрать "->all()", то не может найти поле из таблицы photo. Подскажите, пожалуйста, как правильно реализовать?
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. Конечно же all() надо убрать, вот тут:
$query = Album::find()->joinWith('photo')->orderBy('id')->all();

Надо иметь объект yii\db\Query или AR. Откуда он там вообще?
2. join никак не должен влиять на пагинацию, так как пагинация будет для Album, а не для при присоединенных данных, хоть миллион их присоединяйте. Дело именно в том что Вы пытаетесь клонировать то что нельзя клонировать:
https://www.php.net/manual/ru/language.oop5.cloning.php
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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