Lab / YII

YII2: Связь между моделями

В сегодняшней заметке я покажу вам как создать связь между моделями. Рассмотрим зачем это нужно на примере блога.

Итак предположим вы создали два CRUD'a первый отвечает за создание постов в блоге, второй за создание разделов блога. В посте есть поле раздел, где хранятся числовое значение в таблице поста. Числовое значение в данном случае соответсвует ID раздела в его таблице. Для начала неплохо было бы создать возможность выбора категории вместо ввода её ID.

Для этого во вьюсе _form необходимо получить массив дынных из модели категорий, для этого подключите модель Tags. Тут-же подключим херлпер для работы с массивами.

use yii\helpers\ArrayHelper;
use app\models\Tags;

Теперь необходимо заменить сгенерированое GII поле tags на выпадающий список в который мы посредством хелпера массива передали список категорий из модели Tags:

<?= $form->field($model, 'tags')->dropDownList(ArrayHelper::map(Tags::find()->all(), 'tid', 'title')) ?>

Отлично, теперь при создании и редактировании материалов у вас появится выпадающий список со всеми доступными категориями. Теперь неплохо бы и в индексном списке заменить ID категории на названия.

Для этого в модели постов указываем по какому полю будем делать связь:

public function getTagz()
{
 return $this->hasOne(Tags::className(), ['tid' => 'tags']);
}

Теперь в таблице GridView заменим поле строку категорий на следующий вид:

[
 'attribute' => 'tags',
 'value' => 'tagz.title',
 'filter' => $tagz,
],

Осталось только передать массив доступных значений в $tagz для возможности фильтрации