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 для возможности фильтрации