Php приклад використання orm doctrine
В даній статті розглянемо простенький приклад використання ORM, а саме, Doctrine. Якщо хто не в курсі, то ORM (Object-Relational Mapping, об'єктно-реляційна проекція) - така штука, яка забезпечують класів прозорий доступ до бази даних. Правда не всяким класах, а тим, які представляють опис нашої моделі даних. Загалом мені б пару років назад дізнатися про таку штуку, може бути я і не закинув вивчення php, і взагалі, багато чого корисного зробив: D. Якщо хтось знайомий з патернами проектування, то можна сказати, що Doctrine відповідає шаблоном Active Record. На свій сором, сам я не знайомий з ними, тому нічого конкретніше сказати не можу поки що.
До речі, ми вже торкалися мигцем тему ORM, але тільки для python. Можете подивитися про SQLAlchemy тут.
Далі буде розглянуто приклад написання модуля на php з використанням ORM Doctrine для відправки особистих повідомлень між користувачів.
Для початку визначимося з нашою таблицею. Я вирішив використовувати всього одну табличку, і для кожного повідомлення так само зберігати тільки один запис в БД. І так, поля таблиці виглядають у мене приблизно так:
- id - id повідомлення;
- uid_from - id відправив користувача;
- uid_to - id одержувача;
- title - заголовок повідомлення;
- text - текст повідомлення;
- flag_unread - прапор нового повідомлення;
- flag_del_from - ознака віддаленого повідомлення з вихідних;
- flag_del_to - ознака віддаленого повідомлення з вхідних;
- date - дата відправки в форматі unix timestamp;
На цьому етап проектування у мене закінчився. Тепер перейдемо до технічної сторони питання.
Тут настроюється підключення до БД і деякі параметри ( "ледачий" спосіб завантаження моделей, валідація даних і т.п.). Останній рядок вказує Doctrine де шукати наші моделі.
Тепер в корені проекту створюємо папку models і в ній файл PrivateMessage.php. Врахуйте, що ім'я файлу і класу, який описаний в ньому, повинні збігатися. Ось як у мене виглядає цей файл:
Тут ми не описали поле id, тому що Doctrine створить його автоматично, якщо не вказано інших первинних ключів (primary key). Так само в таблиці не вказані індексів, що не є добре. Непогано було б зробити їх для полів uid_from і uid_to хоча б. Але не зробимо, бо лінь, як-небудь іншим разом ;-).
Наступним кроком створюємо в корені проекту файл test.php, в якому будуть описані основні функції для роботи з особистими повідомленнями і деякий код для демонстрації функціоналу. Ось вміст цього файлу:
$ Conn-> export-> exportClasses (array ( 'PrivateMessage')) - це рядок створить таблицю private_messaages, якщо такий ще немає. Так що можна її перенести в інсталяційний скрипт, але оскільки у нас немає такого, то ми її залишимо.
$ Curr_uid - ця змінна по ідеї повинна братися з сесії. Як вона повинна називатися в сесії я не знав, тому присвоїв їй значення в коді 1.
get_message ($ id, $ uid) - повертає повідомлення $ id, $ uid передається в усі функції для перевірки приналежності повідомлень активного користувача. Ще раз повторю, ідентифікатор ползьователя повинен братися з сесії.
delete_messages ($ ids, $ uid) - $ ids - масив id'шніков повідомлень, які треба видалити. Реально видаляються записи з БД тільки ті, у яких flag_del_from і flag_del_to рівні 0.
send_message ($ to, $ title, $ text, $ uid) - $ to - id одержувача, $ uid - відправника, остально думаю зрозуміло.
P.S. Це моя перша спроба зробити що-небудь з використанням Doctrine.