PHP ORM: доктрина против пропел - PullRequest
125 голосов
/ 14 января 2010

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

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

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

Ответы [ 10 ]

76 голосов
/ 14 января 2010

Я бы пошел с Доктриной. Мне кажется, что это гораздо более активный проект и, будучи 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();
?>

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

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

Я думаю, что эту страницу из документации Доктрины стоит прочитать: http://www.doctrine -project.org / documents / manual / 1_2 / en / вводная часть: объяснение доктрины

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

40 голосов
/ 14 января 2010

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

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

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

22 голосов
/ 14 января 2010

Все сводится к личным предпочтениям.Я использую Propel, потому что (среди прочего) мне нравится тот факт, что у всего есть свой конкретный метод получения и установки.В Doctrine это не так.

Propel:

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

Doctrine:

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

Мне нравится иметь геттеры и сеттеры, потому что я могу поставитьвсякая логика в них, если нужно.Но это только мое личное предпочтение.

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

20 голосов
/ 16 января 2010

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

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

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

5 голосов
/ 26 сентября 2012

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

5 голосов
/ 14 января 2010

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

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

2 голосов
/ 05 августа 2018

После нескольких лет использования я предпочитаю Propel 2 Doctrine, просто исходя из того, как вы строите логику запроса. Доктрина настолько глубока, насколько это возможно, и управление многими ее аспектами соответствует этому уровню глубины. У Propel I есть более гибкий и управляемый объектами способ построения и управления взаимодействиями запросов.

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

В конце концов, оба являются мощными, управляемыми и выполнят свою работу. Мои личные проекты и интересы используют Propel ORM 2 и будущие проекты, если они все еще будут написаны на PHP.

Я пользуюсь обоими ежедневно в течение последних 3-4 лет.

2 голосов
/ 14 января 2010

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

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

http://trac.symfony -project.org / вики / ComparingPropelAndDoctrine

Оба утверждения любимы доктриной как новым поколением ORM для Symfony.

1 голос
/ 07 апреля 2010

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

0 голосов
/ 18 июня 2016

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

...