Имплементация на ORM в PHP с използване на ActiveRecord като пример
ORM (object-relational mapping) се превежда като обектно-релационно преобразуване. Може би най-често срещаната парадигма за разработка на софтуер е парадигмата на обектно-ориентираното програмиране. В него всички обекти от реалния свят са представени от подобни обекти в кода със същия или подобен набор от характеристики. Необичайно е програмистите, които пишат програми в OOP парадигмата, да пишат SQL заявки към базата данни на много части, за да извършат каквото и да е действие. Тези действия трябва да бъдат капсулирани в конкретен клас или набор от класове, които биха взаимодействали с базата данни и скривали нейната структура.
Една реализация на технологията ORM е шаблонът за проектиране ActiveRecord, описан от Мартин Филър в неговата книга Модели на архитектурата на корпоративното приложение. Класът, който прилага този шаблон, трябва да отговаря на определени изисквания:
- класът е показване на таблица от базата данни;
- всеки екземпляр на класа е ред в изобразената таблица;
- кодът взаимодейства с изобразената таблица изключително чрез внедрения клас.
Мисля, че ще стане по-ясно с нагледен пример.
Да кажем, че имаме таблица с продукти в базата данни със следната структура:
Име на полето | Измерение | Задължителен | Описание на полето |
документ за самоличност | int (11) | Да (първичен ключ) | Идентификатор |
заглавие | varchar (255) | да | Име |
цена | int (11) | да | Цена |
отстъпка | int (11) | да | Отстъпка |
описание | текст | Не | Описание/обяснение |
И за тази таблица трябва да внедрим класа ActiveRecord. Първо, нека създадем продуктов клас и да добавим всички полета от таблицата с продукти към него:
След това нека добавим гетери и сетери за полетата. Ще има само получател за полето $id, тъй като стойността на това поле се задава автоматично, когато нов ред се вмъкне в базата данни. Конструкторът е обявен за частен. След това статичният метод newEmpltyInstnace ще бъде използван за създаване на нови празни екземпляри:
И така, сега можем да създадем нов празен екземпляр на обект и да го присвоим на полета със стойност. Трябва да добавите метод за запазване на стойности в базата данни. Тъй като показвам само пример за внедряване на ActiveRecord, ще използвам функции като mysql_query за работа с базата данни, въпреки че в действителност трябва да бъде внедрен специален клас, за да взаимодейства с базата данни. Затова засега ще пропуснем свързването с базата данни. Така че кодът за запазване е:
Когато извиквате метода save(), нека определим дали този запис съществува в базата данни. Ако е така, тогава екземплярът вече има зададено поле $id и всички други полета в базата данни ще бъдат актуализирани; ако няма поле $id, тогава към базата данни се добавя нов запис и идентификаторът от базата данни се присвоява на полето $id на екземпляра на класа.
Така че с помощта на нашия клас можете да създавате нови полета в базата данни и да ги актуализирате. Но какво да кажем за премахването? За да направите това, нека създадем статичен метод за изтриване:
Остава да напишем няколко спомагателни статични метода за удобство при търсене в нашата таблица с продукти:
Методът find() връща масив от екземпляри на клас, които съответстват на заявката за търсене за таблицата с продукти, методът count() връща броя на записите в таблицата, а методът newInstance() връща единичен екземпляр от класа.
Всичко! Вече разполагаме с пълния набор от инструменти за манипулиране на таблицата с продукти с помощта на класа Product. полетакласовете са декларирани скрити, така че е невъзможно директно да се задават стойности, тъй като в полето за настройка можем да проверим зададените стойности в съответствие с типа данни, посочени в базата данни, за да избегнем грешки.
Внедреният клас, php страницата, която използва възможностите на класа, както и sql файлът за импортиране в базата данни с таблицата продукти и съдържанието му може да бъде изтеглен от github
ORM е измислен за удобна работа с базата данни по отношение на OOP.
Шаблонът за проектиране на ActiveRecord е концепция за ORM технология.