Від автора: вітаю вас, друзі. Отже, ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii. І в цій статті ми продовжимо вивчення компонента Yii2 моделі. Зокрема, ми дізнаємося, що таке пов’язані моделі і як здійснюються зв’язки моделей.
Отже, ми продовжуємо знайомство з моделями. Нагадаю, у попередній статті ми з вами створили першу модель для роботи зі статтями, налаштували підключення до БД і отримали масив статей у вигляді масиву об’єктів. Використовуючи метод render() контролера, ми передали отримані дані подання. Тепер черга за малим — потрібно вивести ці дані. Тут все просто, досить запустити цикл foreach і пройтися по масиву статей.
Список статей
title ?>
У результаті ми повинні отримати приблизно таку картину:
Ми без особливих проблем отримали список статей. Але, як ви пам’ятаєте, кожна стаття належить до певної категорії. Давайте створимо таку таблицю і заповнимо її тестовими даними.
CREATE TABLE IF NOT EXISTS `category` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`keywords` varchar(255) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Як ви пам’ятаєте, поле category_id таблиці post засилає на поле id таблиці category і вказує на приналежність статті до певної категорії. Так от, як би нам, дістаючи статті, заодно дістати і категорії, до яких відносяться дані статті? Простіше кажучи, потрібно виконати щось на кшталт об’єднання таблиць (JOIN).
Для рішення даної задачі у фреймворку передбачені зв’язку. Фактично це аналог тих самих зв’язків SQL, які ми знаємо під назвами один-до-одного, один-до-багатьох і т. д. Отже, для реалізації зв’язку нам потрібно буде створити для початку ще одну model, яка буде працювати з категоріями.
namespace app\models;
use yii\db\ActiveRecord;
class Category extends ActiveRecord
{
}
Ну а тепер необхідно пов’язати моделі, використовуючи метод геттер. У класі Post створимо наступний метод:
class Post extends ActiveRecord
{
public function getCategory(){
return $this->hasOne(Category::className(), [‘id’ => ‘category_id’]);
}
}
Давайте розберемо цей метод. Почнемо з назви — getCategory. Фактично це ім’я зв’язку, яке скаже нам, що метод встановлює зв’язок з Category. Метод звертається до методу hasOne, який описує зв’язок один-до-одного. Першим параметром методу hasOne() ми повинні передати ім’я класу моделі, з якої необхідно встановити зв’язок. Робити це рекомендується саме так, як ми прописали в коді НазваниеМодели::className(). Другим параметром ми передаємо масив, де ключем виступає поле таблиці, з якої ми зв’язуємося, а значенням — полі поточної таблиці. У нашому прикладі ключ id — це поле `category`.`id`, значення — `post`.`category_id`.
Як тепер отримати доступ до пов’язаних даними? Простіше простого. Після визначення зв’язку, нам доступно віртуальне властивість з ім’ям геттера зв’язку. Оскільки геттер ми назвали getCategory, віртуальне властивість буде називатися category. Чому віртуальне? Тому що в об’єктах масиву $posts у нас зараз не буде такої властивості. Тим не менше, якщо ми звернемося зараз у циклі до цієї властивості — ми отримаємо пов’язані дані. Давайте спробуємо зробити це в поданні.
category) ?>
В результаті ми побачимо, що ця властивість зберігається об’єкт Category.
Залишилося лише звернутися до потрібних властивостям даного об’єкта. Наприклад, виведемо найменування категорії, до якої належить той чи інший пост.
Категорія: category->name ?>
Як бачимо, зв’язку працюють і дуже зручні у використанні. У контролері ми не змінили жодного рядка коду, але отримали додаткові дані. На цьому ми, мабуть, поки що зупинимося. Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.