PHP ORM: Доктрина против Propel

Я начинаю новый проект с symfony, который легко интегрируется с Doctrine и Propel , но мне, конечно же, нужно сделать выбор … Мне было интересно, есть ли у более опытных людей общие плюсы и минусы для общения с любой из этих двух?

Большое спасибо.

EDIT: Спасибо за все ответы, полезные вещи. На этот вопрос нет действительно правильного ответа, поэтому я просто отмечу как одобренный тот, который получил самые популярные голоса.

Я бы пошел с Доктриной. Мне кажется, что это гораздо более активный проект и являющийся стандартным ORM для Symfony, он лучше поддерживается (хотя официально ORM считаются равными).

Кроме того, мне больше нравится, как вы работаете с запросами (DQL вместо критериев):

<?php // Propel $c = new Criteria(); $c->add(ExamplePeer::ID, 20); $items = ExamplePeer::doSelectJoinFoobar($c); // Doctrine $items = Doctrine_Query::create() ->from('Example e') ->leftJoin('e.Foobar') ->where('e.id = ?', 20) ->execute(); ?> 

(Реализация Доктрины для меня намного интуитивна).

Кроме того, я действительно предпочитаю, как вы управляете отношениями в Доктрине.

Я думаю, что эта страница из документации Doctrine заслуживает внимания: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Подводя итог: если бы я начинал новый проект или должен был выбирать между изучением Доктрины и Propel, я бы пошел на Doctrine в любой день.

Я предвзятый, так как я немного помогу в следующем выпуске Propel, но вы должны подумать, что Propel действительно был первым ORM доступным, а затем немного отставал, когда Doctrine был создан, но теперь снова активно развивается. Symfony 1.3 / 1.4 поставляется с Propel 1.4, где большинство сравнений останавливается на Propel 1.3. Кроме того, следующий выпуск Propel (1.5) будет содержать много улучшений, особенно при создании вами Criteria (в результате чего вам будет меньше кода для написания).

Мне нравится Propel, потому что он кажется менее сложным, чем Doctrine: большинство кода находится в нескольких сгенерированных классах, тогда как Doctrine разделяет функциональность во многих классах. Мне нравится хорошо понимать библиотеки, которые я использую (не слишком много «магии»), но, конечно, у меня больше опыта с Propel, поэтому, возможно, Doctrine не так сложна за кулисами. Некоторые говорят, что Propel работает быстрее, но вы должны это проверить сами, и подумайте, не перевешивает ли это другие различия.

Возможно, вам стоит также рассмотреть возможность использования плагинов Symfony для разных фреймворков. Я считаю, что Propel имеет преимущество здесь, но я не знаю, сколько из перечисленных плагинов по-прежнему актуально с последней версией Symfony.

Это зависит от личных предпочтений. Я использую Propel, потому что (между прочим) мне нравится тот факт, что у всех есть свой собственный метод getter & setter. В Доктрине это не так.

Propel:

 $person->setName('Derek'); echo $person->getName(); 

доктрина:

 $person->name = 'Derek'; echo $person->name; 

Причина, по которой мне нравится иметь getters & seters, заключается в том, что я могу поместить в них все виды логики, если нужно. Но это только мои личные предпочтения.

Я должен также добавить, что хотя Propel был медленным в прошлом, он теперь активно развивается. За последние несколько месяцев он выпустил несколько новых версий. Самая последняя версия Propel включает «свободный интерфейс запросов», подобный Doctrine , поэтому вам больше не нужно использовать критерии, если вы этого не хотите.

Следует отметить, что Doctrine 2 в настоящее время находится в разработке, выпущенном [ed], и функции почти полностью отличаются от текущей стабильной версии Doctrine 1. Она использует шаблон Data Mapper вместо Active Record и использует «менеджер сущностей» для обработки персистентности логика. Когда он будет выпущен, он будет иметь более близкое сходство с Hibernate Java (Doctrine 1 больше похож на Rails ActiveRecord).

Я развиваюсь с альфа-релизом Doctrine 2 и должен сказать, что это головы и плечи выше Doctrine 1 (просто мое мнение, и я никогда не использовал Propel). Скорее всего, сообщество доктрины будет двигаться к нему, когда оно будет выпущено.

Я бы посоветовал вам проверить Doctrine, но если вы предпочитаете стиль Active Record, который использует Propel и Doctrine, вы можете просто придерживаться Propel.

Эти две ссылки несколько устарели, поэтому вы, тем не менее, охватываете некоторые общие положения, в основном вы должны оценить свой опыт работы с базой как таковой, основным недостатком доктрины является невозможность иметь среду IDE, которая позволяет вам автокодировать в этом продвижении победитель, учение о кривых обучения и доктрина очень разные, его легче продвигать, если вашему проекту нужно будет управлять сложной моделью данных, использует доктрину, если вы хотите быстро работать с ORM, который лучше всего документирован и найти дополнительную поддержку в Propel Интернет использует, гораздо более зрелый, и я считаю, что большинство используется.

http://propel.posterous.com/propel-141-is-out

Я бы предложил использовать propel 1.6, который лучше подходит для функции автозаполнения IDE.

Я не являюсь пользователем PHP 5 non-framework ORM, но вот несколько хороших сравнений (если вы их еще не видели):

http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update/

http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine

Оба варианта являются фаворитами в отношении доктрины как нового поколения ORM для Symfony.

Я бы предложил использовать DbFinder Plugin . На самом деле это очень мощный плагин, который поддерживает оба, и довольно неплохо мощный. Мне действительно нравится использовать его лучше, чем любой другой.

Если я не ошибаюсь, оба ORM используют схему на основе XML, и создание этого определения схемы довольно громоздко. Если вам нужна простая схема на основе PHP с плавным стилем. Вы можете попробовать LazyRecord https://github.com/c9s/LazyRecord, который поддерживает автоматические генераторы сценариев миграции и обновления / понижения. И все файлы классов генерируются статически без затрат времени исполнения.