PHP ORM: Doctrine vs. Propel

126

Rozpoczynam nowy projekt z symfony, które jest łatwo zintegrowane z Doctrine i Propel , ale oczywiście muszę dokonać wyboru ... Zastanawiałem się, czy bardziej doświadczeni ludzie mają ogólne wady i / lub zalety którykolwiek z tych dwóch?

Wielkie dzięki.

EDYCJA: Dzięki za wszystkie odpowiedzi, przydatne rzeczy. Nie ma prawdziwie poprawnej odpowiedzi na to pytanie, więc zaznaczę jako zatwierdzoną tę, która otrzymała najwięcej głosów pozytywnych.

Tomek
źródło
5
Chłopaki, czy są jakieś zaktualizowane odpowiedzi? Widząc, że jest to nieaktualne
Qiniso

Odpowiedzi:

76

Poszedłbym z Doctrine. Wydaje mi się, że jest to znacznie bardziej aktywny projekt i będąc domyślnym ORMem dla symfony jest lepiej obsługiwany (nawet jeśli oficjalnie ORMy są uważane za równe).

Ponadto bardziej podoba mi się sposób, w jaki pracujesz z zapytaniami (DQL zamiast Kryteriów):

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

(Implementacja Doctrine jest dla mnie dużo bardziej intuicyjna).

Poza tym naprawdę wolę sposób, w jaki zarządzasz relacjami w Doctrine.

Myślę, że warto przeczytać tę stronę z dokumentacji Doctrine: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Podsumowując: gdybym zaczynał nowy projekt lub musiał wybierać między nauką Doctrine a Propel, wybrałbym Doctrine każdego dnia.

phidah
źródło
42
W Propel 1.5 to zapytanie można również zapisać jako Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (lub findPK (20) po złączeniu, jeśli Id jest twoim podstawowym klucz). Jak widać, pobiera ładną składnię z Doctrine i dodaje trochę więcej. Wydanie jest planowane na koniec pierwszego kwartału 2010 roku, ale możesz je teraz przetestować w swoich projektach Symfony.
Jan Fabry
Niezłe wejście, nie wiedziałem tego :-)
phidah
9
wdrożenie doktryny wydaje mi się znacznie bardziej złożone. Get Entity manage get repository ... this and that
SoWhat
1
doktryna zbytnio komplikuje sprawy ... po prostu nie normalna jest droga
Geomorillo
40

Jestem stronniczy, ponieważ pomagam trochę przy następnym wydaniu Propela, ale musisz wziąć pod uwagę, że Propel był rzeczywiście pierwszym dostępnym ORMem, a potem trochę się opóźniał, gdy powstał Doctrine, ale teraz ponownie jest aktywnie rozwijany. Symfony 1.3 / 1.4 pochodzi z Propel 1.4, gdzie większość porównań kończy się na Propel 1.3. Ponadto, następne wydanie Propela (1.5) będzie zawierało wiele ulepszeń, szczególnie w tworzeniu kryteriów (w wyniku czego będzie mniej kodu do napisania).

Lubię Propela, ponieważ wydaje się być mniej złożony niż Doctrine: większość kodu znajduje się w kilku wygenerowanych klasach, podczas gdy Doctrine podzielił funkcjonalność na wiele klas. Lubię dobrze rozumieć biblioteki, których używam (nie za dużo "magii"), ale oczywiście mam większe doświadczenie z Propelem, więc może Doctrine nie jest tak skomplikowana za kulisami. Niektórzy mówią, że Propel jest szybszy, ale powinieneś sam to sprawdzić i rozważyć, czy przeważa to nad innymi różnicami.

Może powinieneś również rozważyć dostępność wtyczek Symfony dla różnych frameworków. Uważam, że Propel ma tutaj przewagę, ale nie wiem, ile z wymienionych wtyczek jest wciąż aktualnych w najnowszej wersji Symfony.

Jan Fabry
źródło
4
Nowe ulepszenia zapytań w Propelu 1.5 są naprawdę fajne.
Tom,
23

Sprowadza się do osobistych preferencji. Używam Propela, ponieważ (między innymi) podoba mi się fakt, że wszystko ma swoją własną konkretną metodę getter & setter. W Doctrine tak nie jest.

Napędzać:

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

Doktryna:

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

Powodem, dla którego lubię mieć metody pobierające i ustawiające, jest to, że w razie potrzeby mogę umieścić w nich wszelkiego rodzaju logikę. Ale to tylko moje osobiste preferencje.

Powinienem również dodać, że chociaż Propel w przeszłości działał wolno, obecnie jest ponownie w fazie aktywnego rozwoju. W ciągu ostatnich kilku miesięcy wydał kilka nowych wersji. Najnowsza wersja Propela zawiera "płynny interfejs zapytań" podobny do Doctrine , więc nie musisz już używać Kryteriów, jeśli nie chcesz.

lo_fye
źródło
7
w Doctrine można nadpisywać metody ustawiające i pobierające dla każdej właściwości, a także mieć własną logikę (patrz doctrine-project.org/documentation/manual/1_2/en/ ... - wyszukaj ATTR_AUTO_ACCESSOR_OVERRIDE, aby przejść do odpowiedniej sekcji)
Marek Karbarz
Wygląda dobrze, ale nadal ustawiasz właściwość, wywołując: $ x-> propname = 'abc'; Jest to problematyczne, ponieważ wydaje się, że nie obsługuje przekazywania wielu parametrów.
lo_fye
20

Należy zauważyć, że Doctrine 2 jest obecnie w fazie rozwoju, wydany [wyd.] I funkcjonuje prawie zupełnie inaczej niż obecna stabilna wersja Doctrine 1. Opiera się na wzorcu Data Mapper zamiast Active Record i używa „menedżera encji” do obsługi trwałości logika. Po wydaniu będzie bardziej podobny do Hibernate'a Javy (Doctrine 1 jest bardziej podobny do ActiveRecord Railsów).

Rozwijałem się wraz z wydaniem alfa Doctrine 2 i muszę powiedzieć, że jest o głowę i ramiona ponad Doctrine 1 (tylko moja opinia i nigdy nie korzystałem z Propela). Jest duża szansa, że ​​społeczność Doctrine podejdzie do tego, gdy zostanie wydana.

Zachęcam cię do wypróbowania Doctrine, ale jeśli wolisz styl Active Record, którego teraz używają Propel i Doctrine, możesz po prostu pozostać przy Propel.

Bryan M.
źródło
4
Niedawno została wydana stabilna wersja Doctrine 2. doctrine-project.org/blog/doctrine2-released
Trevor Allred,
5

Te dwa odniesienia są nieco przestarzałe, więc mimo wszystko omawiasz kilka ogólników, w zasadzie musiałbyś ocenić swoje doświadczenie z frameworkiem jako takim, główną wadą doktryny jest niemożność posiadania IDE, które pozwala na automatyczne kodowanie w tym programie zwycięzca, krzywe uczenia się napędzają i doktryny są bardzo różne, łatwiej jest napędzać, jeśli twój projekt będzie musiał zarządzać złożonymi danymi, model używa doktryny, jeśli chcesz szybko pracować z ORM, który jest najlepiej udokumentowany i znaleźć więcej wsparcia w Propelu Korzystanie z internetu jest znacznie bardziej dojrzałe i uważam, że najczęściej używane.

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

Mauricio Herrán
źródło
W świecie symfony wydaje się, że Doctrine jest zdecydowanie najczęściej używana - szczególnie w nowszych projektach. Jest oczywiście wiele projektów sf 1.0, które nadal używają Propela, ponieważ Doctrine nie było dostępne dla symfony do 1.1.
phidah
5

Sugerowałbym użycie propel 1.6, który jest lepszy dla funkcji autouzupełniania IDE.

petkopara
źródło
26
-1 Autouzupełnianie IDE nie powinno być powodem technicznego wyboru
Clement Herreman
14
@ClementHerreman Zgadzam się, że nie powinno być to kryteria, ale wierzę, jak można być produktywny z danej technologii z pewnością powinny być powodem wyboru tego. Dlatego z całym szacunkiem nie zgadzam się z twoim głosem negatywnym… niezależnie od tego, czy zgadzasz się z odpowiedzią, nie jest to „zła” (a może tak?) I jest do pewnego użytku (chyba że jest błędna, w takim przypadku) , należy to zaznaczyć).
Sepster
2
IMO, jeśli twoja produktywność jest bardziej poprawiona przez autouzupełnianie zamiast jakości oprogramowania, intuicyjności i spójności, to dzieje się coś dziwnego. Zobacz codinghorror.com/blog/2009/01/… . Ale masz rację, w pewnym momencie ta odpowiedź nie jest zła , po prostu niewystarczająco dobra, może nawet nie jest dobra.
Clement Herreman
1
@ClementHerreman, jeśli nie jest pomocny, nie używaj go już;), +1
amd
Czy są jakieś aktualne odpowiedzi na to pytanie? To jest nieaktualne.
Qiniso
2

Nie jestem użytkownikiem ORM niezwiązanego z frameworkiem PHP 5, ale oto kilka dobrych postów porównawczych (na wypadek, gdybyś ich jeszcze nie widział):

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

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

Oba wnioski faworyzowane w Doctrine jako nowszej generacji ORM dla Symfony.

Trav L
źródło
1
Dla przypomnienia, to porównanie jest całkowicie nieaktualne - obecna wersja Propel używa PDO, obsługuje relacje „wiele do wielu” i ma świetną dokumentację. Warto również wziąć pod uwagę: niektórzy z nas wolą styl zapytań pełnych konstruktorów kryteriów od zastrzeżonych języków zapytań, takich jak DQL - ma obsługę IDE i jest klasą, więc możesz ją rozszerzyć. Nadal próbuję wybierać, ale widzę wiele plusów dla Propel over Doctrine, jeśli nie masz nic przeciwko statycznemu generowaniu kodu i widzisz zalety "prawdziwego" kodu PHP w przeciwieństwie do zastrzeżonego języka zapytań , który jest po prostu ciągiem znaków do IDE.
mindplay.dk
2

Po wielu latach używania obu z nich wolę Propel 2 od Doctrine w oparciu o to, jak skonstruujesz logikę zapytań. Doktryna jest tak głęboka, jak to tylko możliwe, a zarządzanie wieloma jej aspektami odpowiada temu poziomowi. Uważam, że Propel ma bardziej płynny i oparty na obiektach sposób budowania i zarządzania interakcjami zapytań.

Dla mnie doprowadziło to do zmniejszenia ilości kodu w modelu i większej liczby struktur wokół tego, jak logika może / będzie przetwarzana. Spowodowało to po prostu zbudowanie wielu interakcji jako wspólnej funkcjonalności. (W końcu 90% tego, co zrobisz z bazą danych, będzie w pewnym stopniu operacją prostą).

Ostatecznie oba są potężne, łatwe w zarządzaniu i wykonają zadanie. Moje osobiste projekty i zainteresowania wykorzystują Propel ORM 2 i przyszłe projekty, jeśli nadal będą napisane w PHP, pójdą tą drogą.

Używam obu na co dzień od 3-4 lat.

Ryan Rentfro
źródło
1

Sugerowałbym użycie wtyczki DbFinder . W rzeczywistości jest to bardzo potężna wtyczka, która obsługuje oba i jest całkiem niezła. Właściwie lubię go używać lepiej niż oba.

Mike Crowe
źródło
@Mike: dzięki, nie wiedziałem o wtyczce, ale wygląda na to, że obsługuje tylko do Sf1.2. Ostatecznie zdecydowałem się na Doctrine, wydaje mi się, że był to właściwy wybór, chociaż pisanie bezpośredniego SQL jest potrzebne do bardziej złożonych rzeczy.
Tom
-2

Jeśli się nie mylę, oba ORMy używają schematu opartego na XML, a tworzenie tych definicji schematu jest dość uciążliwe. Jeśli potrzebujesz prostego schematu opartego na PHP z płynnym stylem. Możesz wypróbować LazyRecord https://github.com/c9s/LazyRecord obsługuje automatyczną migrację i generatory skryptów aktualizacji / obniżenia. Wszystkie pliki klas są generowane statycznie bez kosztów wykonania.

c9s
źródło