Мой путь в изучении Doctrine. Вводная статья.
В общем подвернулся мне недавно проектик, в принципе простенький апи поднять для флешки, ну и чтоб сайтик на нем крутился ещё. Предполагалось много возни с базой, в частности с NestedSets (вложенные множества, кому интересно что это, рекомендую почитать здесь http://www.getinfo.ru/article610.html). Я подумал… и решил: - Все хватит говнокодить пора переходить к новому уровню познания!! Вперед к моделям!!
Вообще я любитель изобретать велосипеды, но тут я решил сначала, увидеть, попробовать, что такое ORM в действии, а в следствии и решить нужно чёнить сочинять или нет.
Начнем пожалуй с определения ORM.
ORM (англ. Object-relational mapping, русск. Объектно-реляционная проекция) — запись объектов программы в реляционную базу данных, отображение объекта и его представления в виде набора таблиц (Вкусная копипаста с вики).
А теперь нормальным языком. Уважаемый читатель представь, что вместо таблицы в базе, у тебя есть объект или набор объектов (например классический объект класса Users). У этого объекта есть свойства (id,имя, фамилия), он может посчитать сколько в нем записей, может создать таблицу на основе себя в любой базе, и операционной системе, делать выборки, кэшировать результаты своей деятельности, связывать себя с другими такими же моделями и ещё много всего разного. И так, подытожим: модель – это представление таблицы в базе данных.
Теперь нужно выбрать самую крутую ORM, для этого, я забрался на хабр и набрал там волшебные три буквы (нет не те три буквы). Сразу выдало Doctrine, правда я нашёл ещё какую-то orm, но её официальный сайт не открылся :)) наверное божий промысел подумал я … и выбрал Doctrine.
И так копипасту в студию!!
Doctrine — объектно-реляционный проектор (ORM) для PHP 5.2.3+, который базируется на слое абстракции доступа к БД (DBAL). Одной из ключевых возможностей Doctrine является запись запросов к БД на собственном объектно-ориентированном диалекте SQL, называемый DQL (Doctrine Query Language) и базирующийся на идеях HQL (Hibernate Query Language).
А теперь как всегда по человечески. Это состоит из 3-х частей первая часть, собственно работа с моделями, она организует доступ к моделям, создание моделей из базы и тд. Вторая слой DQL специальный язык запросов. Ну и последний, это сама абстрактная обертка, которая в свою очередь формирует запросы в зависимости от выбранного драйвера. Это если очень упрощено там есть ешё валидация, пагинаторы, NestedSets и другие расширения, но об это позже.
Теперь примеры, начнем с того что вставим в табличку новую запись, через модель:
$user = new User();
$user->username = 'Вася';
$user->password = '123';
$user->save();
Что мы тут натворили, мы вставили в табличку запись с полями password и username. Вот так вот элементарно. Хотя, внимательный читатель спросить: - что за … new Users. Где он взялся?
Ответ прост это и есть сама модель таблицы Users.
Давайте посмотрим что внутри:
class Users extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('users');
$this->hasColumn('username', 'string', 255);
$this->hasColumn('password', 'string', 255);
}
}
Здесь мы видим, что наш класс наследуется от Doctrine_Record(что является представлением записей в этой таблице).
setTableDefinition()- это своеобразный конструктор, который вызывается при создании объекта, в нем мы указываем как называется наша табличка, и какие поля там есть их свойства. Это так сказать минимальная конфигурация модели. А вот о том до чего можно довести эту модель, мы поговорим в следующих статьях.
Еще один приятный сюрприз, это то, что Doctrine поддерживает генерацию моделей YML. Это упрошенное представление модели, из которого может сгенерироваться наша модель Users, выглядит это примерно вот так:
Users:
columns:
username: string(255)
password: string(255)
Удобно не правда?
А теперь давайте выберем из таблицы все записи, в этом нам поможет DQL.
$q = Doctrine_Query::create()
->select('u.*)
->from('Users u');
$Users = $q->execute();
print_r($Users->toArray());
Через свойство create(), статичного класса Doctrine_Query, мы создаем запрос, добавляем какие поля нам выбирать, в данном случае все поля таблицы Users(если мы хотим выбрать только username то написать нужно типа ‘u.username’). В методе from(), мы указываем из какой модели выбирать поля. Модели, а не таблицы, которая в базе вообще может называться Base_users_site.
Ну и ‘u’ просто alias чтоб удобно обращаться, можем обойтись и без него просто писать: ’имя_модель.колонка’.
Идем дальше $q->execute() просто выполняет запрос и возвращает объект выборки, а у него уже есть метод(toArray()), который конвертирует все данные в массив вида.
Array
(
[0] => Array
(
[id] => 1
[username] => Вася
[password] => 123
)
)
Если вызвать метод $q->getSqlQuery() то мы можем посмотреть на запрос, полученный в итоге:
SELECT
u.id AS u__id,
u.username AS u__username,
u.password AS u__password
FROM Users u
Как видим Doctrine формирует много лишнего, это раздражает и с этим придется жить.
Именно на этом месте, мне реально надоело писать :))
Потому начнем подводить итоги:
1. Это всего лишь вводная статья, и не как не претендует на описание все Doctrine или хотя бы её части. Просто вводная статья, где хотелось объяснить, что это и как она примерно работает.
2. Дальше я буду(надеюсь буду, зная себя могу забить), описывать подключение этого монстра, работу с NestedSets и сношения с другими моделями, но это так планы.
Вам понравилось, хотите попробовать?
http://www.doctrine-project.org здесь вы можете скачать Doctrine, а также там есть очень удобная документация, на английском правда.
Минусы, которые я заметил:
Это чудо нанотехнологий при подключении у меня, комфортно расположилось в почти 5 мег., памяти. Правда я использовал 1.2.1, как свидетельствуют тесты 2.0.0 которая, кстати альфа, занимает меньше памяти и работает быстрее но сам не пробывал, т.к. ей нужно php 5.3, кстати о требованиях, всё это счастье требует php 5.2.3+ и PDO в придачу так что смотрите, не провтычте с выбором хостинга.
Подробнее о Doctrine и о программировании читайте на моем сайте http://www.team.ks.ua/
оценка: +1
автор: titanium
|
комментариев нетСтатьи с похожими тегами ↓
Работа в Киеве, работа в Москве: менеджер, программист, юрист. Горячие вакансии. — Безработных.Нет
Салаты, дессерты, торты, рыбные, мясные, блюда из овощей, птицы, рецепты блюд

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