ORM в цмс magento

в 17:39, , рубрики: Magento, orm, php

Прочитав данный пост habrahabr.ru/post/303028/#first_unread. Я призадумался а почему многие разработчики не спешат её использовать? И почему у людей складываеться мнение, что они умнее тех кто разрабатывал, и поддерживал этот функционал годами. И как вы уже догадались поговорим о ORM!

Дело в том что, magento построена на патерне MVC, и это не для кого не секрет. Расмотрим модель, ибо модель и есть частная реализация Entity manager. Допустим у нас есть таблица `«mymodule_mytable»`, и соответственная модель `«mymodule/mytable»`.
Получаем модель:

$myModule = Mage::getModel('mymodule/mytable')

При инициализации модели. Magento автоматом создаёт сетеры и гетеры, точнее они реализованны с использованием магических методов `__set()` и `__get()`. К примеру наше сущьность(таблица в базе данных) имеет поля `id,first_name,last_name`

Далее расмотрим, повседневные операции над таблицами:
1. Создание строки `insert` в mysql, на объектным диалекте магенты это будет выглядеть так

try {
   $myModule
       ->setFirstName('myFirstName')
       ->setLastName('myLastName')
       ->save();
} catch(Exception $error) {
 // error loging
}

2. Выборка строки из базы, поля по `id`:

  $myModule->load($id);

3. Изменения строки

try {
  $myModule
        ->load($id)
        ->setFirstName('MyFirst')
        ->save();
} catch(Exception $error) {
 //loging error
}

4. Транзакции

    // ...
    $adapter        = $this->_getWriteAdapter();
    // ...
    $adapter->beginTransaction()
    try {
       $myModel->setFirstName('MyFirstName')->save();
       $adapter->commit();
    } catch(Exception $error) {
       $adapter->rollback();
   }

Это базовые свойства модели, Наверное вы спросите, а как же получить некое количество данных, используя ORM? Дело в том что в магенто есть реализация collection. Создаёться отдельный фаил для подгрузки коллекции. Тут я должен, сделать небольшое отступление, если ваша модель работает с базой данных, то она точно будет иметь реализацию resource, и collection. Я понимаю что это надо было написать ещё в начале. Но я не стал этого делать. Так как мы говорим о ORM.

Продолжим рассматривать операции на ORM над таблицами:

5. Выборка всех полей из таблицы:

     $myCollection = $myModel->getCollection()->load();

6. Фильтрация полей

     $myCollection = $myModel->getCollection();
     $myCollection->addFieldToFilter('first_name',array(
         'eq' =>  'MyFirstName'
     ));
     $myEntityes = $myCollection->load();

Не буду рассматривать все доступные методы они похожи на mysql `like,in,notlike,regexp,notin` и д.р. всё это есть в документации.

7. Выборка определёных полей

    $myCollection->addFieldToSelect(
        array('id','first_name');
    )

А где же join скажете вы? С join более сложнее так как в большинстве случаев мы должны создать EAV model, Entity-attribute-value (сущность атрибуты значения). Для большинства задач мы должны создать EAV модель, в которой будут храниться некие атрибуты нашей сущности. join в коде это некий кастыль, так как в какой то момент разработки у нас есть `id|first_name|last_name` и после неких доработок мы приходим к `id|first_name|last_name|data1|data2… data322`, и тут разработчик вдруг решает, сделать ещё таблицу которую будет joinit для модификации и записи, каких либо дополнительных полей. В конце концов мы приходим к тому что не можем просто решить элементарные задачи не изменив таблицы, не поправив `join` и запросы…
Как рас EAV решает эту проблему вы можете с лёгкостью добавить аттрибут и работать с ним, вы можете дать возможность пользователю добавлять новые аттрибуты, и небояться что ц вас что то где то отвалиться или измениться…
И на этом я закончу, если статья будет интересна я напишу продолжение о создание eav model, и использование таких моделей…

Автор: lnroma

Источник

Поделиться новостью

* - обязательные к заполнению поля