Отзывы об использование ORM

ваяс

Все чикан-пикан
WMix
Что лично вы используете, можно посмотреть?
Если своя, то пару классов взглянуть хотелось бы.
 

WMix

герр M:)ller
Партнер клуба
now изучаю zf2 вот пример записи http://framework.zend.com/manual/2.1/en/user-guide/database-and-models.html
PHP:
    public function addAction()
    {
        $form = new AlbumForm();
        $form->get('submit')->setValue('Add');
 
        $request = $this->getRequest();
        if ($request->isPost()) {
            $album = new Album();
            $form->setInputFilter($album->getInputFilter());
            $form->setData(array_merge_recursive(
                $request->getPost()->toArray(),
                $request->getFiles()->toArray()
            ));
 
            if ($form->isValid()) {
                $album->exchangeArray($form->getData());
                $this->getAlbumTable()->saveAlbum($album);
                return $this->redirect()->toRoute('album');
            }
        }
        return array('form' => $form);
    }


// а вот из модели кусок
    public function saveAlbum(Album $album)
    {
        $data = array(
            'artist' => $album->artist,
            'title'  => $album->title,
        );

        $id = (int)$album->id;


        if ($id == 0) {
            $this->tableGateway->insert($data);
            $id = $this->tableGateway->lastInsertValue;
        } else {
            if ($this->getAlbum($id)) {
                $this->tableGateway->update($data, array('id' => $id));
            } else {
                throw new \Exception('Form id does not exist');
            }
        }
        if( $album->image ){
            rename($album->image['tmp_name'],'./public/img/album/'.$id.'.png' );
            $imagine = new \Imagine\Gd\Imagine();
            $imagine->open('./public/img/album/'.$id.'.png')
                ->thumbnail(new \Imagine\Image\Box(100, 100), \Imagine\Image\ImageInterface::THUMBNAIL_INSET)
                ->thumbnail(new \Imagine\Image\Box(40, 40), \Imagine\Image\ImageInterface::THUMBNAIL_OUTBOUND)
                ->save('./public/img/album/.thumb/'.$id.'.png')
            ;
        }
    }
чаще использую ORM чем нативные запросы
 
Последнее редактирование:

Тугай

Новичок
Чем вот это
PHP:
ORM->get('users')->where('pipirka') и т.д.
Удобнее вот этого
PHP:
SELECT * FROM users и т.д.
Если вопрос про билдер SQL запросов, то это не про ORM же.
Есть несколько плюсов, код будет чище, если запрос собирается из частей для частей не нужно заводить переменные при этом части можно заменять. Ну и в придачу экранирование параметров.
 
Последнее редактирование:

keltanas

marty cats
Нет, это не ORM.

ваяс
То, что ты написал - это query builder. Он, как правило входит в ORM, но сам таковым не является.
ORM - это, если расшифровать, объектно-реляционное отображение. Вдумайтесь, что может значить эта фраза, чёрт побери?

Чем вот это ... Удобнее вот этого ...
Тем, что в первом случае получаешь объекты конкретного типа (users) и заранее знаешь, какие поля в объекте user есть и можешь точно определить, где его можно исользовать, а где нет?
Когда делаешь просто запрос, ты не можешь точно знать, данные какого типа извлек и как с ними работать? Во всяком случае, когда за твой код возьмется другой человек, ему потребуется гораздо больше времени на отладку этой лапши.
Чем, например, отличается массив из таблицы users, от массива из таблицы companies? Да ни чем, пока не будет проведен дополнительный анализ.
 

ваяс

Все чикан-пикан
Тем, что в первом случае получаешь объекты конкретного типа (users) и заранее знаешь, какие поля в объекте user есть и можешь точно определить, где его можно исользовать, а где нет?
Когда делаешь просто запрос, ты не можешь точно знать, данные какого типа извлек и как с ними работать? Во всяком случае, когда за твой код возьмется другой человек, ему потребуется гораздо больше времени на отладку этой лапши.
Чем, например, отличается массив из таблицы users, от массива из таблицы companies? Да ни чем, пока не будет проведен дополнительный анализ.
Я вас понял, а можете вы что то показать, что вы используете?
Ну и в придачу экранирование параметров.
А а я и не экранирую, у меня все запросы параметризированные, ну а на счёт чистоты кода, вы правы,
keltanas в принципе написал то же самое
 

keltanas

marty cats
Дак если на symfony, то doctrine (но, планирую и пропел попробовать, но это AR). Если проект на yii, то местную AR. Если в своем велосипеде, то свою велосипедную (просто лень на докртину переводить).

Используется примерно так:
PHP:
// Сохранение
$entity  = new Pass();
$form = $this->createForm(new PassType(), $entity);
$form->submit($request);

if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($entity);
    $em->flush();

    $session->getFlashBag()->set('info', sprintf('Pass "%s" created successfully', $entity->getId()));

    return $this->redirect($this->generateUrl('pass_show', array(
                'id' => $entity->getId()
            )));
}

return $this->render(
    'PassBundle:Pass:new.html.twig',
    array(
        'entity'  => $entity,
        'form'    => $form->createView(),
    )
);


// Получение
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('PassBundle:Pass');

try {
    $entity = $repository->findOneByPk($type, $id);
} catch (NoResultException $e) {
    throw $this->createNotFoundException('Unable to find Pass entity.');
}

return array(
    'entity'  => $entity,
);
 

Тугай

Новичок
Есть путаница с терминологией. Что считать ORM?
1. Набор инстурментов работы с БД.
2. Результат применение инструментов работы с БД для установки отображения объектов и данных реляционной базы.
3. Набор объектоно орентированных инструментов работы с бд.
4. Результат применения объектоно орентированных инструментов работы с бд для установки отображения объектов и данных реляционной базы.
5. Такие объекто-орентированные "механизмы" и инструменты работы с бд, которые позволят выполнить отбражение объектов любой сложности на данные реляционной базы.

Если перечислить, те что касаются ORM и которые в каком-то виде есть в современных PHP фреймворках:
1. DAO
2. Конструктор запросов
3. Active Record
3.1 Data Table Gateway+Data Row Gateway
4. Реляционная Active Record или связи между таблицами
5. Слой который относится к DDL, это схема бд, миграции, ...
6. Слой который помогает со связями между свойствами классов и полями в таблицах бд.
7. ...

Doctrine - это ORM, а вот Zend_Db и Zend\Db - это не ORM.

Как и что теперь сравнивать?
Написал бы снова про яболни :), но не буду. Большинство авторов всяких книжек склоняется к тому, что самое красивое что получилось напрограммировать - это Doctrine.

Моя практика, это Zend_Db, обычное PDO и расширение mysql.
В этой простой цепочке PDO - лучше расширения mysql, Zend_Db - лучше PDO.
Doctrine мне не нужна в том смысле, что нет подходящей задачи и времени, чтоб начать ее использовать. :)

Нужно ли использовать ORM? Как напсал C., если у нас ОО фреймворк и мы используем ООП,
то его просто нельзя не использовать.
 
Последнее редактирование:
  • Like
Реакции: WMix

keltanas

marty cats
Тугай
Зачем вся эта вода? Это как раз и запутывает людей и вносит недопонимание во вполне конкретные определения.
И почему люди, вместо того, чтобы следовать здравой логике, начинают приписывать в классические определения какой-то свой смысл?
Все гораздо проще и прозаичнее.
 
  • Like
Реакции: Dez

Тугай

Новичок
keltanas
Ты предлогаешь читать викепедию и гугл ? :) Лучше наверно выдумывать новые слова типа бандл, тогда верующие не сбегут. Где они классические определения ?
Между классикой и LAMP не просто пропасть, а пропасть которую охраняют. :)
 

keltanas

marty cats
При чем тут LAMP? Какие еще умные аббревиатуры приплетешь сюда? Большинство здесь скорее всего LNPP используют. Дальше что? Как это связано с ORM?
В википедии по крайней мере более грамотно изложен материал, чем у тебя. Так что да, предлагаю ее, как более достоверный источник.
Классические определения в литературе есть, почитай.
 
Последнее редактирование:

michelle

Новичок
<sarcazm mode=on>
Тогда уж, в нашем глубоко уважаемом форуме, есть те кто использует LAOP, LNOP, LLMP, LLPP, LLOP, UNMP, UAPP, UNOP, ULMP, ULPP ну и так далее
</sarcazm>
 

Absinthe

жожо
Про типичное решение MNMR для девелопмента тоже не стоит забывать :)
 

hell0w0rd

Продвинутый новичок
ОРМ - это когда вы обращаясь к объекту работающему с базой получаете не результат запроса, а готовый объект/набор объектов. Все. То что кто-то придумывает обертки над sql, квери-билдеры и прочее - это просто удобное API, можно было бы и без всего этого.

А на вопрос ТС, у меня от доктрины сложилось отрицательное впечатление. На мой взгляд она слишком наворочена в тех местах, где это совсем не требуется. Мне интересно увидеть карту классов доктрины, потому что складывается полное ощущение что ключевые объекты друг на друга ссылаются, друг друга постоянно дергают, и никто толком ни за что не отвечает.
Из не надуманных минусов - нельзя на лету(или скажите как) переключать режим загрузки объекта. То есть по умолчанию все грузится лениво, а можно все сразу, но сначала это нужно описать в конфиге.
Как написал тугай, доктрина решает задачи субд, но не дает доступа напрямую к нативным решениям, например чтобы встроить NOW(), надо написать расширение
Доктрину еще за доки ругают - но вроде последнее время они сильно за них взялись)
 

WMix

герр M:)ller
Партнер клуба
Из не надуманных минусов - нельзя на лету(или скажите как) переключать режим загрузки объекта. То есть по умолчанию все грузится лениво,
это как у ферарри минус - гоняет сволочь!
 

keltanas

marty cats
hell0w0rd
Потому что доктрина - это не абстакция для MySQL. Если на поле с датой повесить @ORM\PrePersist с $this->createdAt = new \DateTime('now') то не должно возникать таких вопросов.
PHP:
/**
 * @ORM\PrePersist
 */
public function setCreatedAtValue()
{
    $this->createdAt = new \DateTime('now');
}
Что ты имеешь в виду под: "То есть по умолчанию все грузится лениво, а можно все сразу, но сначала это нужно описать в конфиге." ?
Имеешь в виду создание объектов через прокси? Или жадную загрузку коллекций?
Если второе, то посмотри опцию fetch="EAGER"
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
keltanas
Да, но это нельзя переключать на лету. То есть может мне не надо всегда загружать сразу, а в каких-то случаях нужно

NOW() я привел как пример. Да, работа с датами укладывается в DateTime в большинстве случаев. http://habrahabr.ru/qa/42782/ - вот пример. Если честно я не понимаю, зачем доктрина проверяет синтаксис, если потом тоже самое сделает движок субд. Возможно это нужно для безболезненного переключения между СУБД, но это все равно оверхед на мой взгляд.
 
Сверху