Имплементация на 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 технология.