Давайте напишем пару слов о популярном сейчас ORM Doctrine, научимся устанавливать его, использовать в своих проектах наряду с Zend Framework’ом.
Установка Doctrine
В первую очередь скачиваем с официального сайта Doctrine, я свое ознакомление начал со стабильной версии 1.2, хотя для скачивания доступна вторая версия (бета), думаю ее “пощупаю” немного попозже. Распаковываем ее и копируем папку lib из Doctrine-* в include_path, я поместил ее в /usr/share/php/. Теперь напишем первый скрипт, который проверит работу Doctrine. Хотя подождите, подготовим сначала базу данных и наполним ее данными для тестов. За неимением лучшего я всего скачиваю mysql wordl database (на этот раз это будет innoDB версия) по ссылке и создаю пользователя для тестов с паролем и логином таким же, как и название базы данных. У меня получился пользователь world с паролем world и база данных тоже называется world, теперь приступим.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Дальше запускаем наш скрипт и видим, если все сделали правильно, список всех баз данных.
Генерация моделей Doctrine
Так как Doctrine идет в комплекте с мощным генератором моделей, который может “читать” существующую базу данных и создавать классы моделей. Чтобы увидеть это в действии, запустим следующее.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
К сведению, Doctrine для каждой таблицы в базе данных создает 2 класса модели, базовый класс и класс-наследник. Базовый класс расширяет Doctrine_Record и включает определения таблицы и базовые операции по работе с таблицей. Класс-наследник – это место для написания дополнительного функционала, который мы собираемся добавить в модель.
Теперь скопируем все получившиеся модели (их должно получиться 6 штук) в наш Zend Framework проект в папку application/models.
Настраиваем модельные связи
Doctrine – очень мощный ORM, но она не может справиться с установлением связей между таблицами, чем мы займемся сами. Doctrine поддерживает все виды связи один-к-одной, один-ко-многим, многие-ко-многим и рекурсивную используя всего 2 метода hasOne() и hasMany(). У каждого метода два аргумента: имя другой модели для объявления связи и массив опций, характеризующих связь. Для того, чтобы связи автоматически загружались поместим их в setUp() метод.
models/City.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
models/Country.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
models/CountryLanguage.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Автозагрузка классов Doctrine в Zend Framework
Все что осталось сделать, так это то, чтобы приложение Zend Framework и Doctrine хорошо жили совместно. В первую очередь поместим Doctrine в папку library Zend Framework’а. Следующая стадия – обновить конфигурационный файл application.ini, поместив туда строку DSN, чтобы Doctrine могла без проблем соединяться с базой данных. Допишем в [production] секцию
1
|
|
Финальным шагом для инициализации Doctrine напишем защищенный метод в нашем бутстрапе. application/Bootstrap.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Операции с моделью Doctrine
До того, как погрузиться в кроличью, освоим элементарные операции с моделями. Извлечение данных … по ID:
1 2 3 4 |
|
… всех записей:
1 2 3 4 |
|
Также в Doctrine есть свой язык запросов DQL (Doctrine Query Language), который предоставляет гибкий интерфейс для создания и выполнения запросов. Посмотрим на примеры.
1 2 3 4 5 |
|
Использование условий
1 2 3 4 5 6 |
|
В DQL много приятных плюшек, среди которых группировка и сортировка, но мы остановимся чуть подробнее на присоединении таблиц, для которого предусмотрены два метода leftJoin() и innerJoin(). А где же присоединение справа спросите вы, оно как считают разработчики не нужно, ведь можно так спроектировать запрос, чтобы присоединение справа не было нужно.
1 2 3 4 5 6 7 |
|
Поля необходимые для соединения таблиц автоматически устанавливаются Doctrine, основываясь на связях, определенных в методе setUp модели.
Небольшой совет: используя DQL, иногда необходимо посмотреть что же там получилось, для этого и существует метод getSqlQuery(), который и возвращает сырой SQL.
Doctrine и CRUD
Сейчас научимся элементарным операциям аля create, read, update и delete (CRUD). Для добавление новой записи, вам необходимо создать экземпляр класса, заполнить все поля (свойства) и вызывать метод save(). Вот пример
1 2 3 4 5 6 7 8 |
|
Изменим-ка что-нибудь в уже существующей записи. Для начала найдем ту, в которой и будем что-либо менять, затем сохраним, вызвав save() метод.
1 2 3 4 5 |
|
Удалять записи также легко, как и создавать новые, только вместо save() нужно использовать delete().
Вернемся к Zend Framework’у
Чтобы закрепить знания, давайте попробуем все это дело привести в более приятный вид. Сделаем все это в IndexController, чтобы не плодить тестовых контроллеров. Вот его код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
И для этого дела приделаем способ отображение а-ля index/show.phtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Теперь когда вы зайдете по адресу yourhost.local/index/show/id/10, вы увидите часть информации о нем.
Вот и подошла к концу очередная заметка на тему веб-программирования, так мне интересную, надеюсь, вам понравилось.
И кстати, если кто увидит ошибки, прошу сообщать, очень не уверен, что правильно расставил связи один-ко-многим и один-к-одному. Заранее благодарю откликнувшихся.