Мой путь в изучении 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/


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

Логин:
Пароль:
Проверочное число: