У цій серії статей про програмування в Yii2 я розповідають своїм читачам як використовувати фреймворк Yii2 для PHP. У сьогоднішньому підручнику я розповім вам про об'єктно-реляционном відображенні в Yii, відомому як ORM, для роботи з базами даних. Цей шаблон називається Active Record і є ключовим аспектом програмування додатків баз даних в Yii.
Yii пропонує різні способи програмної роботи з вашою базою даних, такі як прямі запити і будівник запитів. але використання Active Record надає повний набір переваг для об'єктно-орієнтованого програмування баз даних. Ваша робота стає більш ефективною, більш безпечної, працює в контексті архітектури MVC і є переноситься, якщо ви вирішите змінити платформу баз даних (наприклад, MySQL на PostgreSQL).
Слідуйте за мною і я докладно розповім про основи Active Record в Yii.
Нагадую, що я активно беру участь в обговореннях, наведених нижче. Мене особливо цікавить, чи є у вас різні підходи, додаткові ідеї або ви хочете запропонувати теми для майбутніх уроків. Якщо у вас є питання або пропозиція, відправте повідомлення нижче. Ви також можете зв'язатися зі мною прямо в Twitter @reifman.
Що таке активний запис?
Клас Active Record пов'язаний з таблицею бази даних, екземпляр Active Record відповідає рядку цієї таблиці, а атрибут реалізації Active Record представляє значення певного стовпця в цьому рядку. Замість написання чистих SQL запитів, ви можете отримати доступ до атрибутів Active Record і викликати методи Active Record для доступу до даних, що зберігаються в таблицях бази даних, і управління ними.
Інтеграція паттерна Active Record в Yii - сильна сторона фреймворка, але загальна для більшості інших фреймворків, таких як Ruby on Rails.
Ця абстракція від моделей до таблиць бази даних дозволяє фреймворку виконувати важку роботу по забезпеченню безпеки, включаючи захист від SQL-ін'єкцій.
Active Record в Yii також підтримує перенесення в багатьох базах даних. Ви можете перемикатися між базами даних без необхідності змінювати свій код:
І такі бази даних NoSQL:
- Redis 2.6.12 або новіший: через yii \ redis \ ActiveRecord. потрібне розширення yii2-redis
- MongoDB 1.3.0 або новішої версії: через yii \ mongodb \ ActiveRecord. потрібне розширення yii2-mongodb
вивчення основ
В даному епізоді я більше сконцентруюся на використанні Active Record в вашому коді.
По-перше, дозвольте мені розглянути, як перетворити модель Yii для використання Active Record. Я скористаюся прикладом моделі, яку я створив в серії «Створюємо свій стартап». Ця серія покаже вам, як я з нуля створюю свій стартап, Meeting Planner. в Yii2.
Використання Active Record в моделі досить просто; Зверніть увагу, що class Launch extends \ yii \ db \ ActiveRecord:
створення запитів
Давайте розглянемо деякі поширені запити Active Record.
індивідуальні записи
Якщо у вас є ідентифікатор запису, який часто ми отримуємо з параметра запиту в контролері, то буде досить легко знайти необхідний запис:
Ви також можете розширити -> where масив великою кількістю полів або булевих умов:
кілька записів
Ось приклад пошуку всіх записів, які відповідають певному status. відсортовані по $ id:
Метод -> all (); вибирає всі записи, а не тільки одну. У змінну $ people повертається масив об'єктів моделі. В іншому випадку, коли немає умов, ви можете отримати доступ до всіх записів з допомогою -> findAll ();
повернення масиву
Використання indexBy повертає масив елементів, індексованих по id:
Альтернативно, ви можете повернути асоціативний масив з -> asArray ():
Примітка. У документація Yii сказано: «Хоча цей метод заощаджує пам'ять і підвищує продуктивність, він розташований ближче до нижнього рівня абстракції БД, і ви втратите більшість функцій Active Record».
підрахунок записів
Ви також можете повернути тільки count записів із запиту:
Для підрахунку статистики я використовую багато значень в Планувальнику зустрічей; дізнайтеся більше в нашому епізоді про панель Dashboard:
Доступ до даних
Коли ви запитуєте дані, такі як окрема модель, легко отримати доступ до даних як до об'єкта моделі:
Я часто обробляю масиви таким чином:
масове присвоєння
Ви також можете швидко присвоїти масив записи моделі за допомогою ActiveRecord:
Або ви можете використовувати -> load () для цього:
Генератор коду Yii Gii відмінно підходить для створення моделей з використанням ActiveRecord, який може згенерувати багато корисного коду, як наприклад моделі, контролери, форми, відображення і т.д.
збереження даних
Як ви можете бачити вище, зберегти дані в Active Record також легко. У цьому прикладі з документації Yii створюється і зберігається новий запис, а потім запис завантажується за ідентифікатором, і зберігаються поновлення:
видалення записів
Видалення запису ще простіше:
оновлення лічильників
Yii також пропонує зручні збільшення лічильника. Припустимо, користувач планує інші збори, а я відстежую їх кількість в таблиці користувачів:
Зв'язування таблиць за індексами - одна з найпотужніших можливостей Active Record. Наприклад, в Planner Meeting кожні збори може мати 0 або більше MeetingPlaces. Модель Meeting.php визначає реляційний ActiveQuery для цього:
Потім я можу отримати доступ до всіх місць зустрічі за допомогою властивості $ meetingPlaces. Нижче я завантажую збори і перебираю все його meetingPlaces досить легко, як якщо б це був вбудований масив подоб'ектов:
Звичайно, все залежить від створення зовнішнього ключа при створенні таблиці в її міграції:
Що далі
Сподіваюся, ви отримали просте уявлення про дивовижну популярності Active Records. Сюди також входять життєві цикли, транзакції і блокування, про які я можу написати в майбутньому. Якщо ви хочете зробити крок вперед, Yii2 пропонує дві великі області для більш докладного вивчення у своїй документації: Yii2 Керівництво по Active Record і функціональні специфікації Yii2 Active Record. Це добре написані статті.
Слідкуйте за майбутніми уроками в серії Програмування на Yii2. де ми продовжуємо занурюватися в різні аспекти фреймворка. Ви також можете ознайомитися з вищезгаданою статтею «Створення свого стартапу на PHP».
Якщо ви хочете знати, коли з'явиться наступний підручник по Yii2, йдіть за мною @reifman в Twitter або перевірте мою сторінку інструктора.