Как в Yii2 работать со связанными таблицами при помощи ActiveRecord?

Здравствуйте!
Изучаю Yii2-фреймворк, дошёл до работы с базой данных.

Генерирую CRUD при помощи gii, в контроллере появляется функция findModel, в которой есть такой запрос:
$model = Pages::findOne($id)
Эта строчка возвращает данные из таблицы по ID.
Мне нужно получить данные из связанной таблицы, я делаю так:
$model = Pages::find()
                ->leftJoin('content', '`content`.`page_id` = `pages`.`id`')
                ->where(['content.page_id' => $id])
                ->all()

Но при этом данные выбираются только из первой таблицы (нужно получить поля и из второй).

В связи с этом возникает 2 вопроса:
1. Обращение к базе данных в контроллере - это вообще нормально? (Всегда думал, что это прерогатива модели, но раз это реализовано на уровне фреймворка? Вообще, мной написанную логику думаю перенести в модель)
2. Как вывести поля связанной таблицы? Где-то нужно изначально указывать, что они существуют? Помогите разобраться!

Спасибо!
  • Вопрос задан
  • 14325 просмотров
Решения вопроса 2
@Mishutka2000
Создать связь c моделью getContents(). После этого можно обратиться к атрибутам связанной таблицы через связь: $model->getContents()
Ответ написан
Комментировать
@urfinjazz Автор вопроса
Отвечу на свой вопрос, вдруг кому-то пригодится.

Итак, задача:
Есть таблица pages и связанная таблица content, в таблице content может быть несколько записей с одним page_id.
Нужно реализовать список всех pages, при клике на "edit page" мы должны попасть на страницу с контентом этой page.

Реализация:
Заходим в gii, создаём модель для pages, если поставить галочку Generate Relations, в моделе создастся функция
getContents()
    {
        return $this->hasMany(Content::className(), ['page_id' => 'id']);
    }

Создаём модель для Content.
Создаём CRUD для Pages.

В контроллере Pages меняем строчку
$model = Pages::findOne($id)
на
$model = Pages::find()->with('contents')->where(['id'=>$id])->one()

Всё. Можем работать с данными из таблицы content.

Первый вопрос - можно ли пихать такое в контроллер - остаётся открытым.
Вернее, я уверен, что не стоит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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