PHP ORM: Доктрина проти руху


126

Я починаю новий проект із симфонії, який легко інтегрується з Доктриною та Пропелем , але мені, звичайно, потрібно зробити вибір .... Мені було цікаво, чи мають більш досвідчені люди там загальні плюси та / або мінуси для поїздки будь-яке з цих двох?

Дуже дякую.

EDIT: Дякую за всі відповіді, корисні речі. На це питання немає справді правильної відповіді, тому я просто зазначу як схвалений той, який отримав найбільш популярні голоси.


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();
?>

(Реалізація доктрини для мене набагато інтуїтивніша).

Крім того, я дуже віддаю перевагу тому, як ти керуєш стосунками в Доктрині.

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

Підводячи підсумок: Якби я починав новий проект або мав вибрати між вивченням доктрини та пропелем, я б хотів би щодня піти на доктрину.


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

Гарний вклад, я цього не знав :-)
фіда

9
реалізація доктрини мені здається набагато складнішою. Отримайте управління
суттю

1
доктрина закінчується ускладненням речей ... просто невідомий шлях
Геоморілло

40

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

Мені подобається Propel, тому що він здається менш складним, ніж Doctrine: більшість кодів знаходиться в декількох створених класах, тоді як Doctrine розбила функціональність на багато класів. Мені подобається добре розуміти бібліотеки, якими я користуюся (не надто "магія"), але, звичайно, у мене є більший досвід роботи з Propel, тому, можливо, доктрина не така складна за кадром. Деякі кажуть, що Propel швидше, але ви повинні перевірити це на собі і подумати, чи переважає це інші відмінності.

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


4
Нові покращення запитів у Propel 1.5 справді приємні.
Том

23

Це зводиться до особистих уподобань. Я використовую Propel, тому що (крім усього іншого) мені подобається той факт, що все має свій метод конкретного геттера та сетера. У Доктрині це не так.

Привід:

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

Вчення:

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

Причина, що мені подобається мати гетерів та сеттерів, полягає в тому, що я можу вкладати в них всіляку логіку, якщо потрібно. Але це лише мої особисті переваги.

Я також повинен додати, що хоча Propel в минулому повільно рухався, він зараз знову активно розвивається. За останні кілька місяців він випустив кілька нових версій. Остання версія Propel включає в себе "вільний інтерфейс запитів", подібний до Doctrine , тому вам більше не потрібно використовувати критерії, якщо ви цього не хочете.


7
у Doctrine ви можете переосмислити сеттери та getters для кожної властивості, а також мати власну логіку (див. doctrine-project.org/documentation/manual/1_2/en/… - шукайте ATTR_AUTO_ACCESSOR_OVERRIDE, щоб потрапити до відповідного розділу)
Marek Karbarz

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

20

Слід зазначити, що Doctrine 2 в даний час розроблений [ випущений ] і функціонує майже повністю від поточної стабільної версії Doctrine 1. Він покладається на шаблон даних Mapper замість Active Record і використовує "менеджер об'єктів" для обробки наполегливості. логіка. Після виходу він буде мати більшу схожість зі сплячим режимом Java (Доктрина 1 більше нагадує ActiveRecord Rails).

Я розвивався з випуском альфа-доктрини 2, і мушу сказати, що це голови та плечі вище Доктрини 1 (просто моя думка, і я ніколи не використовував Propel). Цілком ймовірно, що спільнота Доктрин рухатиметься до неї, коли вона вийде.

Я б радив вам перевірити доктрину, але якщо ви віддаєте перевагу стилю активного запису, який зараз використовують Propel і Doctrine, ви можете просто дотримуватися Propel.


4
Нещодавно була випущена стабільна версія Доктрини 2. doctrine-project.org/blog/doctrine2-
вийшов

5

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

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


У світі сімфоній здається, що Вчення, безумовно, є найбільш використовуваним - особливо для нових проектів. Звичайно, існує багато проектів sf 1.0, які досі використовують Propel, оскільки доктрина не була доступна для сімфонії до 1.1.
Фіда

5

Я б запропонував використовувати propel 1.6, що краще для функції автозаповнення IDE.


26
-1 Автозаповнення IDE не повинно бути причиною технічного вибору
Клемент Ерреман

14
@ClementHerreman Я згоден , що це не повинно бути в критерії, але я вважаю , наскільки продуктивно одна може бути з тієї або іншою технологією , безумовно , повинна бути причиною його вибору. І з усією належною повагою я не погоджуюсь з вашим дозволом ... незалежно від того, чи погоджуєтесь ви з відповіддю, це не "неправильно" (чи це?), І це приносить користь (якщо це не так, в такому випадку , ви повинні це зазначити).
Сепстер,

2
ІМО, якщо ваша продуктивність покращується за рахунок автозавершення замість якості програмного забезпечення, інтуїтивності та послідовності, то відбувається щось дивне. Дивіться codinghorror.com/blog/2009/01/… . Але ти маєш рацію, в якийсь момент ця відповідь не є помилковою , просто недостатньо хорошою, можливо навіть не хорошою.
Климент Ерреман

1
@ClementHerreman, якщо це не корисно, не використовуйте його більше;), +1
amd

Чи є актуальні відповіді на це? Це вихід застарілий.
Цинісо

2

Я не є користувачем PHP 5 поза рамкових ORM, але ось кілька хороших постів порівняння (якщо ви їх ще не бачили):

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

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

Обидва вилучення улюблені в доктрині як нове покоління ORM для Symfony.


1
Наслідком цього порівняння є абсолютно застарілим - поточна версія Propel дійсно використовує PDO, використовує підтримку багато-багато-багато відносин і має чудову документацію. Також варто врахувати: деякі з нас віддають перевагу стилю запитів для багатослівних критеріїв, а не над власними мовами запитів, такими як DQL - у нього є підтримка IDE, і це клас, тому ви можете розширити його. Я все ще намагаюся вибирати, але я бачу багато плюсів для Propel over Doctrine, якщо ви не заперечуєте проти генерації статичних кодів і бачите переваги "справжнього" PHP-коду на відміну від фірмової мови запитів , що є лише рядком IDE.
mindplay.dk

2

Після використання обох протягом декількох років я віддаю перевагу Propel 2 перед доктриною просто на основі того, як ви будуєте свою логіку запитів. Вчення настільки глибоке, наскільки воно може отримати і керування багатьма аспектами його відповідає такому рівню глибини. Пропел, який я відчуваю, має більш текучий та об'єктний спосіб побудови та управління взаємодіями із запитами.

Для мене це призвело до меншого коду в моделі та більшої кількості структур навколо того, як логіка може / буде оброблятися. Це призвело до просто розробки багатьох взаємодій як загальної функціональності. (Зрештою, 90% того, що ви будете робити з базою даних, буде певною мірою жорсткою роботою.)

Врешті-решт, обидва є потужними, керованими та отримають роботу. Мої особисті проекти та інтереси використовують Propel ORM 2 та майбутні проекти, якщо вони все ще написані на PHP, піде цим шляхом.

Я використовую обидва щодня протягом останніх 3-4 років.


1

Я б запропонував використовувати плагін DbFinder . Це насправді дуже потужний плагін, який підтримує і те, і досить приємний потужний. Я насправді люблю використовувати його краще, ніж будь-який.


@Mike: дякую, не знав про плагін, але, здається, він підтримує лише до Sf1.2. Зрештою, я пішов з доктриною врешті-решт, відчуваю, що це був правильний вибір, хоча писати прямий SQL потрібно для більш складних речей.
Том

-2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.