Yii2 моделі. Частина 2

351

Від автора: вітаю вас, друзі. Отже, ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii. І в цій статті ми продовжимо вивчення компонента Yii2 моделі. Зокрема, ми дізнаємося, що таке пов’язані моделі і як здійснюються зв’язки моделей.

Отже, ми продовжуємо знайомство з моделями. Нагадаю, у попередній статті ми з вами створили першу модель для роботи зі статтями, налаштували підключення до БД і отримали масив статей у вигляді масиву об’єктів. Використовуючи метод render() контролера, ми передали отримані дані подання. Тепер черга за малим — потрібно вивести ці дані. Тут все просто, досить запустити цикл foreach і пройтися по масиву статей.

Список статей

title ?>

excerpt ?>

У результаті ми повинні отримати приблизно таку картину:

Yii2 моделі. Частина 2

Ми без особливих проблем отримали список статей. Але, як ви пам’ятаєте, кожна стаття належить до певної категорії. Давайте створимо таку таблицю і заповнимо її тестовими даними.

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
{
}

Yii2 моделі. Частина 2

Ну а тепер необхідно пов’язати моделі, використовуючи метод геттер. У класі 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.

Yii2 моделі. Частина 2

Залишилося лише звернутися до потрібних властивостям даного об’єкта. Наприклад, виведемо найменування категорії, до якої належить той чи інший пост.

Категорія: category->name ?>

Yii2 моделі. Частина 2

Як бачимо, зв’язку працюють і дуже зручні у використанні. У контролері ми не змінили жодного рядка коду, але отримали додаткові дані. На цьому ми, мабуть, поки що зупинимося. Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.