Как вывести запрос с INNER JOIN в Yii2?

Товарищи, не могу понять как вывести на странице данные из двух таблиц с inner join.
Еще точнее, вообще не могу реализовать вывод собственного запроса. Перечитал много документации и вопросов, но пока не соображаю.

Есть две таблицы: teachers и discipline. В discipline имеется столбец teacher_id. Нужно вывести преподавателей из teachers с прикрепленными к ним именами дисциплинам из discipline (teachers.id = discipline.teacher_id).
Сам запрос отрабатывает как надо.
SELECT
`teachers`.`FIO`,
`discipline`.`name`
FROM
`teachers` INNER JOIN `discipline`
ON
`teachers`.`id` = `discipline`.teacher_id

Как составить запрос, чтобы можно было вывести дисциплины к преподавателю? По документации не выходит создать свой запрос, чтобы он заработал в views файле.

Сам вывод на страницу сейчас такой.
Контроллер (для страницы views/teachers/all.php)
...
    public function actionAll()
    {
        $query = Teachers::find();
        
        $pagination = new Pagination([
            'defaultPageSize' => 15,
            'totalCount' => $query->count(),
        ]);

        $teachers = $query->orderBy('FIO')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('all', [
            'teachers' => $teachers,
            'pagination' => $pagination,
        ]);
    }
...


Модель
class Teachers extends ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'teachers';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'FIO'], 'required'],
            [['id', 'lead_krb', 'lead_magist', 'ped_practices', 'jobs_zav_kaf', 'lead_aspir'], 'integer'],
            [['classes_subject', 'lead_practice', 'job_gak'], 'number'],
            [['FIO'], 'string', 'max' => 255],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'FIO' => 'ФИО',
            'classes_subject' => 'Занятия по дисциплинам',
            'lead_practice' => 'Рук-во практикой',
            'lead_krb' => 'Рук-во КРБ',
            'lead_magist' => 'Рук-во маг.диссертацией',
            'ped_practices' => 'Пед. практика',
            'job_gak' => 'Работа ГАК, защита',
            'jobs_zav_kaf' => 'Работа по заданию зав.каф.',
            'lead_aspir' => 'Рук-во аспирантами',
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getDisciplines()
    {
        return $this->hasMany(Discipline::className(), ['teacher_id' => 'id']);
    }

    /**
     * @inheritdoc
     * @return TeachersQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new TeachersQuery(get_called_class());
    }


Представление
<h1>Преподаватели</h1>
<table class="table table-hover table-bordered">
    <thead>
    <tr>
        <th>ФИО</th>
        <th>Дисциплина</th>
        <th>Занятия по дисциплинам</th>
        <th>Руководство практикой</th>
        <th>Руководства КРБ</th>
        <th>Руководство маг.диссертацией</th>
        <th>Педагогич. практика</th>
        <th>Работа ГАК, защита</th>
        <th>Работа по заданию зав.каф.</th>
        <th>Руководство аспирантами</th>
    </tr>
    </thead>
    <tbody>
    <?php foreach ($teachers as $teacher): ?>
    <tr>
        <td><?= $teacher->FIO ?></td>
        <td> дисциплина</td>
        <td><?= $teacher->classes_subject ?></td>
        <td><?= $teacher->lead_practice ?></td>
        <td><?= $teacher->lead_krb ?></td>
        <td><?= $teacher->lead_magist ?></td>
        <td><?= $teacher->ped_practices ?></td>
        <td><?= $teacher->job_gak ?></td>
        <td><?= $teacher->jobs_zav_kaf ?></td>
        <td><?= $teacher->lead_aspir ?></td>
    </tr>
    <?php endforeach; ?>
    </tbody>
</table>

<?= LinkPager::widget(['pagination' => $pagination]) ?>
  • Вопрос задан
  • 2536 просмотров
Решения вопроса 1
fornit1917
@fornit1917
$teachers = Teachers::find()->with('disciplines')->all();

    <?php foreach ($teachers as $teacher): ?>
    <tr>
        <td><?= $teacher->FIO ?></td>
        <td>
             <ul>
                  <?php foreach ($teacher->disciplines as $d): ?>
                          <li><?php echo $d->name; ?></li>
                  <? endforeach;?>
            </ul>
        </td>
        <td><?= $teacher->classes_subject ?></td>
        <td><?= $teacher->lead_practice ?></td>
        <td><?= $teacher->lead_krb ?></td>
        <td><?= $teacher->lead_magist ?></td>
        <td><?= $teacher->ped_practices ?></td>
        <td><?= $teacher->job_gak ?></td>
        <td><?= $teacher->jobs_zav_kaf ?></td>
        <td><?= $teacher->lead_aspir ?></td>
    </tr>
    <?php endforeach; ?>


Примерно так. Под капотом, правда, inner join не будет делаться, но вам оно зачем? Если with(relationName) напишите, то работать будет нормально.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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