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

14

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

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

Проте, в цьому зручності може ховатися один підводний камінь. Давайте заглянемо в Yii Debugger — інструмент, який розташований у правому нижньому куті сторінки.

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

Заглянемо у вкладку DB і виявимо там 10 (в моєму випадку) виконаних SQL запитів.

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

Адже у нас усього-на-всього кілька тестових записів в БД. А уявіть, якщо записів на сторінку кілька десятків? Зверніть увагу на запити, які виконує фреймворк. Ми бачимо там однотипні запити отримання категорії за її id. І таких запитів буде стільки, скільки виводиться постів. Чому так відбувається?

А відбувається так через так звану ледачою завантаження даних (відкладене завантаження). Саме вона і використовувалася при зверненні до віртуального властивості, доступному нам після реалізації зв’язку моделей. Використовувати ліниву завантаження дуже зручно оскільки вона працює тільки тоді, коли вона нам потрібна і ми викликаємо її. У цьому легко переконатися, якщо ми зараз заберемо звернення до віртуального властивості з уявлення, ось цю ось рядок:

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

Після цього у нас залишиться всього 3 запиту до БД.

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

Але як бути, якщо зв’язки моделей все-таки потрібні? В даному випадку замість відкладеного завантаження нам потрібно просто звернутися до іншого варіанту завантаження пов’язаних даних в Yii2 — жадібне завантаження. Цей варіант вибирає дані завжди, незалежно від того, потрібні вони нам. У цьому одне з його відмінностей від відкладеного завантаження.

Для того, щоб використовувати жадібне завантаження даних, нам достатньо додати метод with(), вказавши в якості параметра найменування зв’язку (геттер зв’язку в моделі).

$posts = Post::find()->with(‘category’)->all();

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

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

Тепер перевіримо запити до БД. Замість запитів виду SELECT * FROM category WHERE id = … для кожного поста, ми побачимо один запит виду SELECT * FROM category WHERE `id` IN (…). Цим запитом жадібно вибираються всі категорії для одержуваних на сторінку постів.

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

Резюмуючи, можна відзначити, що в залежності від ситуації ви можете використовувати або відкладену, або жадібне завантаження даних. Не забувайте про це і використовуйте інструмент Yii Debugger для відстеження продуктивності вашого додатки, щоб не зіткнутися з ситуацією, коли будуть відпрацьовуватися десятки запитів замість одного.

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