PHP: Пример использования ORM Doctrine

В данном посте рассмотрим простенький пример использования ORM, а именно, Doctrine. Если кто не в курсе, то ORM (Object-Relational Mapping, объектно-реляционная проекция) — такая штука, которая обеспечивают классам прозрачный доступ к базе данных. Правда не всяким классам, а тем, которые представляют описание нашей модели данных. В общем мне бы пару лет назад узнать о такой штуке, может быть я и не забросил изучение php, и вообще, много чего полезного сделал :D. Если кто-то знаком с паттернами проектирования, то можно сказать, что Doctrine соответствует шаблону Active Record. К своему стыду, сам я не знаком с ними, поэтому ничего конкретней сказать не могу пока что.

Кстати, мы уже затрагивали мельком тему ORM, но только для python.

Далее будет рассмотрен пример написания модуля на 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, находим в архиве директорию, где лежит файл Doctrine.php и копируем всё содержимое этого каталога в отдельную папку в нашем проекте (я скопировал в doctrine). Следуя документации, создаём файл bootstrap.php в корне проекта с таким содержанием:

Тут настраивается подключение к БД и некоторые параметры («ленивый» способ загрузки моделей, валидация данных и т.п.). Последняя строчка указывает 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_messages($inbox, $uid) — возвращает все входящие сообщения пользователя $uid, если $inbox равна true, иначе — исходящие. Неплохо было бы добавить лимит на выборку записей (например, с 1й по 20ю, с 21й по 40ю), но поскольку этот модуль нигде применять не планирую, то и доделывать его нет желания. Если кому то надо — пишите в комменты ;-).

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 — отправителя, остально думаю понятно.

Дальше по коду идёт часть с html-выводом и обработкой переданных парамтеров, так что ничего интересного. Код по моему везде достаточно просто, так что подробно объяснять не стал. Если вопросы остались — в комменты.

P.S. Это моя первая попытка сделать что-либо с использованием Doctrine.

Понравилась статья? Поделиться с друзьями:
Комментариев: 1
  1. https://www.youtube.com/channel/UCwpaChjs0grdGbE0fakuB4Q/about

    A fascinating discussion is definitely worth comment.
    I do believe that you should publish more about this subject matter,
    it may not be a taboo subject but generally people don’t talk about these
    issues. To the next! Kind regards!!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: