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


126

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

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

РЕДАКТИРОВАТЬ: Спасибо за все ответы, полезные вещи. На этот вопрос нет действительно правильного ответа, поэтому я просто отмечу как одобренный тот, который получил наибольшее количество голосов.


5
Ребят, есть обновленные отзывы? Видя, что этот способ устарел
Qiniso

Ответы:


76

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

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

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

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


42
В Propel 1.5 этот запрос также можно записать как Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (или findPK (20) после joinWith, если Id является вашим основным ключ). Как видите, он использует красивый синтаксис Doctrine и добавляет немного больше. Релиз запланирован на конец первого квартала 2010 года, но вы можете протестировать его сейчас в своих проектах Symfony.
Ян Фабри

Хороший вклад, я этого не знал :-)
phidah

9
реализация доктрины кажется мне намного более сложной. Получить Entity Manage получить репозиторий ... то и это
SoWhat

1
доктрина слишком усложняет вещи ... просто notorm - лучший способ
Геоморилло

40

Я предвзято, так как я немного помогаю в следующем выпуске 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.


4
Новые улучшения запросов в Propel 1.5 действительно хороши.
Tom

23

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

Propel:

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

доктрина:

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

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

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


7
в Doctrine вы можете переопределить сеттеры и геттеры для каждого свойства, а также иметь настраиваемую логику (см. doctrine-project.org/documentation/manual/1_2/en/… - найдите ATTR_AUTO_ACCESSOR_OVERRIDE, чтобы перейти к соответствующему разделу)
Марек Карбарз,

Выглядит нормально, но вы все равно устанавливаете свойство, вызывая: $ x-> propname = 'abc'; Это проблематично, потому что, похоже, он не поддерживает передачу нескольких параметров.
lo_fye

20

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

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

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


4
Недавно была выпущена стабильная версия Doctrine 2. doctrine-project.org/blog/doctrine2-released
Тревор Оллред,

5

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

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


В мире Symfony кажется, что Doctrine определенно используется наиболее часто, особенно для новых проектов. Конечно, есть много проектов sf 1.0, которые все еще используют Propel, потому что Doctrine не был доступен для symfony до версии 1.1.
phidah

5

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


26
-1 Автодополнение IDE не должно быть причиной технического выбора
Клемент Херреман

14
@ClementHerreman Я согласен , что это не должно быть в критерии, но я считаю , насколько продуктивно одна может быть с той или иной технологией , безусловно , должна быть причиной его выбора. Поэтому при всем уважении я не согласен с вашим отрицательным голосом ... независимо от того, согласны ли вы с ответом, он не «неправильный» (или нет?) , вы должны это указать).
Сепстер,

2
ИМО, если ваша производительность больше повышается за счет автозаполнения вместо качества программного обеспечения, интуитивности и согласованности, тогда происходит что-то странное. См. Codinghorror.com/blog/2009/01/… . Но вы правы, в какой-то момент этот ответ не является неправильным , просто недостаточно хорошим, может быть, даже не лучшим.
Clement Herreman

1
@ClementHerreman, если бесполезно, не используйте его больше;), +1
amd

Есть ли свежие ответы на это? Это устарело.
Qiniso

2

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

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

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

Оба считают, что Doctrine является новым поколением ORM для Symfony.


1
Для справки, это сравнение полностью устарело - текущая версия Propel действительно использует PDO, поддерживает отношения «многие ко многим» и имеет отличную документацию. Также стоит учесть: некоторые из нас предпочитают стиль запросов построителя подробных критериев проприетарным языкам запросов, таким как DQL - он имеет поддержку IDE, и это класс, поэтому вы можете его расширить. Я все еще пытаюсь выбрать, но я вижу много плюсов для Propel по сравнению с Doctrine, если вы не возражаете против статической генерации кода и видите преимущества «настоящего» PHP-кода по сравнению с проприетарным языком запросов. , который представляет собой просто строки для IDE.
mindplay.dk

2

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

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

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

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


1

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


@Mike: спасибо, не знал о плагине, но кажется, что он поддерживает только до Sf1.2. В конце концов, я выбрал Doctrine, и мне кажется, что это был правильный выбор, хотя для более сложных вещей необходимо писать прямой SQL.
Том

-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.