ФорумПрограммированиеPHP для идиотовРасширения PHP → ORM'ы. Что выбрать да и нужно ли?

ORM'ы. Что выбрать да и нужно ли?

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 24 апреля 2010 г. 8:14

    Поискал тут всякое, была тема про DBAL.

    Вот я пока не могу определиться нужно ли мне это или нет. И что выбрать: Propel или Doctrine? Сразу говорю: именно абстракция от типа БД мне не нужна, я не планирую переходить на что-то с мускла, разве некоторые части со временем вынести на key-value хранлища.

    Думаю, что ORM будет именно удобна для создания динамических фильров, о которых недавно говорила Чиффа.
    Спустя 156 сек.
    глянул просто и на пропел и на доктрину - там уже куча всего, что у меня есть, но другое. Те же валидаторы.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 24 апреля 2010 г. 14:30, спустя 6 часов 16 минут 56 секунд

    Я хз, но в кохане вроде терпимый орм, хотя глюки есть. Что там юзается даже не интерисовался…. А вообще в жанге мне нравиться, очень все так удобно, хотя говорят что SQLAlchemy покруче
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 3:29, спустя 12 часов 58 минут 40 секунд

    в пропеле не нравится XML. И то, что ссылка на скачивание редиректит на главную.

    В Доктрине не нравится структура БД через комментарии phpDOC. Но можно через YAML описать структуру
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 25 апреля 2010 г. 3:43, спустя 13 минут 42 секунды

    Мне вообще не нравиться описывать через жопу… отдельные файлы или камменты…. Хотя из двух зол, наверное доктрина лушче
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 3:46, спустя 3 минуты 22 секунды

    не, ну насколько я понимаю еще ж можно внутри классов-моделей пыхом по-простому описать: http://www.doctrine-project.org/documentation/manual/1_2/pl/inheritance

    $this->hasColumn('username', 'string', 20);

    что по сути не хуже твоего
    topic = model.CharField(max_length=255)

  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 25 апреля 2010 г. 3:51, спустя 4 минуты 31 секунду

    На мой вкус это настолько же хуже что и xml/yaml/phpDoc
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 апреля 2010 г. 3:54, спустя 3 минуты 4 секунды


    На мой вкус это настолько же хуже что и xml/yaml/phpDoc
    +1
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 6:50, спустя 2 часа 55 минут 49 секунд

    еще что плохо - все они на PDO а у меня MySQLi. Получается одновременно будет 2 коннекта висеть?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 7:09, спустя 19 минут 37 секунд

    <?php

    /**
    * This file is part of the Propel package.
    * For the full copyright and license information, please view the LICENSE
    * file that was distributed with this source code.
    *
    * @license MIT License
    */

    /**
    * A validator for minimum string length.
    *
    * <code>
    * <column name="password" type="VARCHAR" size="34" required="true" />
    *
    * <validator column="password">
    * <rule name="minLength" value="5" message="Passwort must be at least ${value} characters !" />
    * </validator>
    * </code>
    *
    * @author Michael Aichler <[email protected]>
    * @version $Revision: 1612 $
    * @package propel.runtime.validator
    */
    class MinLengthValidator implements BasicValidator
    {

    /**
    * @see BasicValidator::isValid()
    */
    public function isValid (ValidatorMap $map, $str)
    {
    return strlen($str) >= intval($map->getValue());
    }
    }


    ахуеть, strlen. А если я перейду на UTF-8 мне нужно будет переписать все эти валидаторы самому?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 7:27, спустя 17 минут 58 секунд

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 11:06, спустя 3 часа 38 минут 34 секунды

    между прочим, последний вариант (Jelly) мне пока что нравится больше всего.

    + довольно простое описание моделей
    + есть relations (1:1, 1:n, n:n). Собственно говоря для этого мне и нужен ORM
    + Он легкий. Всего лишь 96 кб*.
    + в нем нет стремных validators, i18n, sfYaml, … . Я не нуждаюсь во всем этом, часть из этого есть в BL, совершенно нет желания дублировать валидаторы. А чего нет - сам добавлю, чай не маленький.
    + какой-то чувак переводит доку на русский


    - загадочная иерархия классов. Есть абстрактный класс и его тут же наследует еще один класс, который пустой. Впервые вижу такое. Хотя наверно неспроста так сделано
    - нет эмуляци неймспейсов (ORM вместо my_ORM). По всей видимости это реально решить благодаря предыдущему пункту.

    - самое хуевое: он зависим от fw Kohana 3 версии. Сама Кохана для меня в общем-то неведома, я понятия не имею что там и как, какой минимальный комплект классов Коханы нужен для запуска этого ORM. * - сколько КБ кода утянет эта Кохана - х3.
    - сама эта ORM'ка "захардкожена". Я хочу прикрутить туда свой Database вместо кохановского, но не могу.

    - в именовании файлов с классами нарушается нотация PEAR. Но в принципе это ерунда
    - он далеко не идеален. Нет toArray (превед ZF, Magento), toXml, toJson, toYaml (ага, сам себе противоречу). Ну ладно нету, но и добавить это проблематично. Было б что-то типа ORM::registerExport(new My_ORM_Export_Xml) и по __call это делали б.
    - есть $user->remove('posts', 1); но нет $user->remove('posts', array(1, 2, 30));
    - ладно remove, но я не нашел insertMultiple
    Спустя 151 сек.
    еще из минусов
    - defined('SYSPATH') or die('No direct script access.'); - меня раздражает вот такая строка в начале каждого файла
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 25 апреля 2010 г. 11:15, спустя 9 минут 21 секунду


    еще из минусов
    - defined('SYSPATH') or die('No direct script access.'); - меня раздражает вот такая строка в начале каждого файла


    о да, это кохана )
    Спустя 152 сек.
    Если он соответствует кохановскому, то там должно быть:
    - as_array()
    - in('posts', array(1,2,3,123))
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 12:57, спустя 1 час 42 минуты 23 секунды

    adw0rd, ага, есть такое дело, провтыкал

    // We have an array of IDs to delete
    $ids = array(1,2,3,4);

    // Method 1. foreach, note that this DOESN'T load the model rows, just deletes them - 4 'DELETE' queries performed
    foreach ($ids as $id)
    {
    Jelly::factory('model')->delete($id);
    }

    // Method 2. One query performed
    Jelly::delete('model')->where(':primary_key', 'IN', $ids);


    может и multipleInsert найду.



    Короче нет времени сейчас заниматься разбором этих либ, через недельки 2 продолжу тему а пока откладываю
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 13:27, спустя 29 минут 4 секунды

    тоже заслуживающая внимания либа http://github.com/m4rw3r/RapidDataMapper
    + без коханы работает

    [h1]-[/h1] одним чуваком разрабатывается
    Спустя 281 сек.
    вот только я не знаю к + или - отнести необходимость создания 2-х классов: описательный и сама модель:


    class Article
    {
       public $id;
       public $title;
       public $slug;
       public $content;

       public $comments = array();
    }

    class ArticleDescriptor extends Db_Descriptor
    {
       function __construct()
       {
           $this->setClass('Article');

           $this->add($this->newPrimaryKey('id'));
           $this->add($this->newColumn('title'));
           $this->add($this->newColumn('slug'));
           $this->add($this->newColumn('content'));

           $this->add($this->newRelation('comments'));

           // Use the Sluggable behaviour to automate slug generation
           $this->applyPlugin(new Db_Plugin_Sluggable(array('title' => 'slug')));
       }
    }
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 25 апреля 2010 г. 13:38, спустя 11 минут 10 секунд

    дык нормально, маппер и энтини, по моему так почти во всех либах
    Work, buy, consume, die

Пожалуйста, авторизуйтесь, чтобы написать комментарий!