PHP ORM'leri: Doctrine vs. Propel


126

Doctrine ve Propel ile kolayca bütünleşen bir symfony ile yeni bir projeye başlıyorum , ancak elbette bir seçim yapmam gerekiyor .... Dışarıdaki daha deneyimli insanların birlikte devam etmek için genel artıları ve / veya eksileri olup olmadığını merak ediyordum. bu ikisinden biri?

Çok teşekkürler.

DÜZENLEME: Tüm yanıtlar, faydalı şeyler için teşekkürler. Bu sorunun gerçekten doğru bir cevabı yok, bu yüzden en popüler olumlu oyu alan cevabı onaylandı olarak işaretleyeceğim.


5
Beyler, güncellenmiş yanıtlar var mı? Bunun
modası geçmiş

Yanıtlar:


76

Doctrine ile giderdim. Bana öyle geliyor ki çok daha aktif bir proje ve symfony için varsayılan ORM olması daha iyi destekleniyor (resmi olarak ORM'ler eşit kabul edilse de).

Ayrıca sorgularla çalışma şeklinizi daha çok beğeniyorum (Ölçütler yerine 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();
?>

(Doktrinin uygulaması benim için çok daha sezgiseldir).

Ayrıca, Doctrine'de ilişkileri yönetme şeklinizi gerçekten tercih ediyorum.

Doctrine belgelerinin bu sayfasının okunmaya değer olduğunu düşünüyorum: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Özetlemek gerekirse: Yeni bir projeye başlıyor olsaydım veya Doktrin ve İlerlemeyi öğrenmek arasında seçim yapmak zorunda kalsaydım, her gün Doctrine'e giderdim.


42
Propel 1.5'te, bu sorgu aynı zamanda Example_Query :: create () -> joinWith ('FooBar') -> filterId (20) -> find () (veya joinWith'den sonra findPK (20) olarak da yazılabilir. tuşu). Gördüğünüz gibi, güzel sözdizimini Doctrine'den alıyor ve biraz daha fazlasını ekliyor. Sürüm 2010'un 1. çeyreğinin sonu için planlanmıştır, ancak şimdi Symfony projelerinizde test edebilirsiniz.
Jan Fabry

Güzel girdi, bunu bilmiyordum :-)
phidah

9
doktrin uygulaması bana çok daha karmaşık görünüyor. Varlığı yönetin depoyu yönet ... bu ve bu
SoWhat

1
doktrin işleri karmaşıklaştırmanın çok ötesinde ... sadece notorm gitmenin yolu
Geomorillo

40

Propel'in bir sonraki sürümünde biraz yardımcı olduğum için önyargılıyım, ancak Propel'in gerçekten de mevcut ilk ORM olduğunu, ardından Doctrine yaratıldığında biraz geciktiğini, ancak şimdi tekrar aktif bir geliştirmeye sahip olduğunu düşünmelisiniz. Symfony 1.3 / 1.4, çoğu karşılaştırmanın Propel 1.3'te durduğu Propel 1.4 ile birlikte gelir. Ayrıca, Propel (1.5) 'in bir sonraki sürümü, özellikle Kriterlerinizin oluşturulmasında (yazmanız için daha az kodla sonuçlanır) birçok iyileştirme içerecektir.

Propel'i seviyorum çünkü Doctrine'den daha az karmaşık görünüyor: çoğu kod üretilen birkaç sınıfta yer alırken, Doctrine işlevselliği birçok sınıfa ayırdı. Kullandığım kütüphaneleri iyi anlamaktan hoşlanıyorum (çok fazla "sihir" değil), ama tabii ki Propel ile daha fazla deneyimim var, bu yüzden belki Doctrine perde arkasında o kadar karmaşık değil. Bazıları Propel'in daha hızlı olduğunu söylüyor, ancak bunu kendiniz kontrol etmeli ve bunun diğer farklılıklardan daha ağır basıp basmadığını düşünmelisiniz.

Belki farklı çerçeveler için Symfony eklentilerinin kullanılabilirliğini de düşünmelisiniz. Propel'in burada bir avantajı olduğuna inanıyorum, ancak listelenen eklentilerin kaçının hala Symfony'nin en son sürümüyle güncel olduğunu bilmiyorum.


4
Propel 1.5'teki yeni sorgu iyileştirmeleri gerçekten çok güzel.
Tom

23

Kişisel tercihlere bağlı. Propel kullanıyorum çünkü (diğer şeylerin yanı sıra) her şeyin kendi somut alıcı ve ayarlayıcı yöntemi olması hoşuma gidiyor. Doktrin'de durum böyle değil.

uskur:

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

doktrin:

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

Alıcılara ve ayarlayıcılara sahip olmaktan hoşlanmamın nedeni, gerekirse onlara her türlü mantığı koyabilmemdir. Ama bu sadece kişisel tercihim.

Ayrıca Propel geçmişte yavaş hareket etmesine rağmen, şimdi tekrar aktif geliştirme aşamasında olduğunu da eklemeliyim. Geçtiğimiz birkaç ay içinde birkaç yeni sürüm yayınladı. Propel'in en yeni sürümü, Doctrine'e benzer bir "akıcı sorgu arayüzü" içerir , bu nedenle istemiyorsanız artık Criteria kullanmak zorunda kalmazsınız.


7
Doctrine'de her özellik için ayarlayıcıları ve alıcıları geçersiz kılabilir ve ayrıca özel mantığa sahip olabilirsiniz (bkz. doctrine-project.org/documentation/manual/1_2/en/… - ilgili bölüme gitmek için ATTR_AUTO_ACCESSOR_OVERRIDE araması yapın)
Marek Karbarz,

İyi görünüyor, ancak özelliği hala $ x-> propname = 'abc'; Bu sorunludur çünkü birden çok parametrenin geçişini desteklemiyor gibi görünmektedir.
lo_fye

20

Unutulmamalıdır Doktrini 2 olduğu gelişiminde halen piyasaya [ed] ve Doktrin yerine Aktif Record Veri Mapper desen dayanır 1'in geçerli kararlı sürümden fonksiyonlar neredeyse tamamen farklı ve sap kalıcılığı ile bir 'varlık yöneticisi' kullanır mantık. Yayınlandığında Java'nın Hazırda Bekletme moduna daha yakın bir benzerlik gösterecek (Doktrin 1 daha çok Rails'in ActiveRecord'una benziyor).

Doctrine 2'nin alfa sürümüyle geliştirme yapıyorum ve bunun Doctrine 1'in yukarısında olduğunu söylemeliyim (sadece benim fikrim ve Propel'ı hiç kullanmadım). Doctrine topluluğunun piyasaya sürüldüğünde ona doğru hareket etme ihtimali yüksektir.

Doctrine'i incelemenizi tavsiye ederim, ancak Propel ve Doctrine'in şu anda kullandığı Aktif Kayıt stilini tercih ediyorsanız, Propel'e bağlı kalmak isteyebilirsiniz.


4
Doctrine 2'nin kararlı bir sürümü kısa süre önce yayınlandı. doctrine-project.org/blog/doctrine2-released
Trevor Allred

5

İki referans biraz modası geçmiş, bu yüzden yine de bazı genellemeleri ele alıyorsunuz, temel olarak çerçeveyle ilgili deneyiminizi bu şekilde değerlendirmek zorunda kalacaksınız, doktrinin en büyük dezavantajı, bu itici güçte otomatik kodlama yapmanıza izin veren bir IDE'ye sahip olamamanızdır. bir kazanan, öğrenme eğrileri ilerleme ve doktrin çok farklıdır, projenizin karmaşık veri modelini yönetmesi gerekecekse, en iyi belgelenmiş bir ORM ile hızlı bir şekilde çalışmak ve Propel'de daha fazla destek bulmak istiyorsanız, ilerlemesi daha kolaydır. İnternet kullanımı, çok daha olgun ve en çok kullanıldığına inanıyorum.

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


Symfony dünyasında, özellikle yeni projeler için Doktrin kesinlikle en çok kullanılan gibi görünüyor. Tabii ki, Doctrine 1.1'e kadar symfony için mevcut olmadığı için Propel kullanan birçok sf 1.0 projesi var.
phidah

5

IDE'nin otomatik tamamlama işlevi için daha iyi olan propel 1.6'yı kullanmanızı öneririm.


26
-1 Bir IDE'nin otomatik olarak tamamlanması teknik bir seçimin nedeni olmamalıdır
Clement Herreman

14
@ClementHerreman Bunun olmamalı hemfikir kriterler, ama kesinlikle olmalı belirli bir teknoloji ile nasıl olabilir üretken bir iman bir o seçilmesinin sebebi. Ve tüm saygımla, bu nedenle olumsuz oyunuza katılmıyorum ... yanıtı kabul edip etmediğinize bakılmaksızın, bu "yanlış" değil (veya değil mi?) Ve bir işe yarıyor (yanlış değilse, bu durumda , bunu belirtmelisiniz).
Sepster

2
IMO, üretkenliğiniz yazılım kalitesi, sezgisellik ve tutarlılık yerine otomatik tamamlama ile daha fazla gelişirse, o zaman tuhaf bir şey olur. Bkz. Codinghorror.com/blog/2009/01/… . Ama haklısın, bir noktada bu cevap yanlış değil , yeterince iyi değil, hatta belki de iyi değil.
Clement Herreman

1
@ClementHerreman, değilse yararlı artık kullanmayın;) +1
amd

Buna herhangi bir güncel yanıt var mı? Bu çok güncel değil.
Qiniso

2

PHP 5 çerçevesiz ORM kullanıcısı değilim, ancak işte bazı iyi karşılaştırma gönderileri (henüz görmediyseniz):

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

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

Her iki sonuç da Symfony için yeni nesil ORM olarak Doctrine'in favorisi.


1
Kayıt için, bu karşılaştırma tamamen güncel değil - Propel'in mevcut sürümü PDO kullanıyor, çoktan çoğa ilişkileri destekliyor ve harika belgelere sahip. Ayrıca dikkate değer: bazılarımız ayrıntılı ölçüt oluşturucu sorgu stilini DQL gibi özel sorgu dillerine tercih eder - IDE desteğine sahiptir ve bu bir sınıftır, böylece genişletebilirsiniz. Hala seçmeye çalışıyorum, ancak Propel over Doctrine için pek çok artı görüyorum, eğer statik kod üretmeye aldırış etmiyorsanız ve özel sorgu dili yerine "gerçek" PHP kodunun avantajlarını görebiliyorsanız , bu sadece bir IDE'ye dizelerdir.
mindplay.dk

2

Her ikisini de birkaç yıl kullandıktan sonra, sorgu mantığınızı nasıl oluşturduğunuza bağlı olarak Propel 2'yi Doctrine'e tercih ediyorum. Doktrin, alabildiği kadar derinlemesine ve birçok yönünü bu derinlik seviyesine uyuyor. İleriye doğru, sorgu etkileşimlerini oluşturmak ve yönetmek için daha akıcı ve nesne odaklı bir yöntem olduğunu düşünüyorum.

Benim için bu, modelde daha az koda ve mantığın nasıl işleneceği / işleneceği konusunda daha fazla yapıya yol açtı. Bu, yalnızca birçok etkileşimi ortak işlevsellik olarak oluşturmaya neden oldu. (Sonuçta, bir veritabanıyla yapacağınızın% 90'ı bir dereceye kadar kaba işlem olacaktır.)

Sonunda, her ikisi de güçlü, yönetilebilir ve işi halledecek. Kişisel projelerim ve ilgi alanlarım Propel ORM 2'yi kullanıyor ve eğer hala PHP ile yazılırsa gelecekteki projeler bu rotaya gidecek.

Her ikisini de son 3-4 yıldır günlük olarak kullanıyorum.


1

DbFinder Eklentisini kullanmanızı öneririm . Bu aslında her ikisini de destekleyen çok güçlü bir eklentidir ve oldukça güçlüdür. Aslında ikisinden de daha çok kullanmayı seviyorum.


@Mike: teşekkürler, eklentiyi bilmiyordum ama sadece Sf1.2'yi destekliyor gibi görünüyor. Sonunda Doctrine'i kullanmaya başladım, daha karmaşık şeyler için doğrudan SQL yazmak gerekli olsa da doğru seçimmiş gibi geliyor.
Tom

-2

Yanılmıyorsam, her iki ORM de XML tabanlı şema kullanıyor ve bu şema tanımını oluşturmak oldukça zahmetli. Akıcı stile sahip PHP tabanlı basit bir şemaya ihtiyacınız varsa. LazyRecord'u https://github.com/c9s/LazyRecord deneyebilirsiniz , otomatik geçişi ve yükseltme / düşürme komut dosyası oluşturucularını destekler. Ve tüm sınıf dosyaları, çalışma zamanı maliyeti olmadan statik olarak oluşturulur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.