PHP ORM: सिद्धांत बनाम प्रोपेल


126

मैं सिम्फनी के साथ एक नई परियोजना शुरू कर रहा हूं जो आसानी से डॉक्ट्रिन और प्रोपेल के साथ एकीकृत है , लेकिन मुझे निश्चित रूप से एक विकल्प बनाने की आवश्यकता है .... मैं सोच रहा था कि क्या अधिक अनुभवी लोगों के पास सामान्य पेशेवरों और / या साथ जाने के लिए सहमति है। या तो ये दोनों?

बहुत बहुत धन्यवाद।

संपादित करें: सभी प्रतिक्रियाओं के लिए धन्यवाद, उपयोगी सामान। इस प्रश्न का कोई सही उत्तर नहीं है, इसलिए मैं केवल उस चिह्न को चिह्नित करूंगा, जिसे सबसे लोकप्रिय वोट मिला था।


5
दोस्तों, क्या कोई अद्यतन प्रतिक्रियाएं हैं? यह देखते हुए कि इस तरह से बाहर
Qiniso

जवाबों:


76

मैं डॉक्ट्रिन के साथ जाऊँगा। यह मुझे लगता है कि यह एक बहुत अधिक सक्रिय परियोजना है और सिम्फनी के लिए डिफ़ॉल्ट ओआरएम होने के नाते यह बेहतर समर्थित है (भले ही आधिकारिक तौर पर ओआरएम को समान माना जाता है)।

इसके अलावा मुझे बेहतर है कि आप प्रश्नों के साथ काम करें (मानदंड के बजाय 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) के बाद भी लिखा जा सकता है अगर Id आपके प्रायमरी है चाभी)। जैसा कि आप देख सकते हैं, यह सिद्धांत से अच्छा वाक्यविन्यास लेता है, और थोड़ा और जोड़ता है। रिलीज़ को Q1 2010 के अंत के लिए योजनाबद्ध किया गया है, लेकिन आप इसे अब अपनी सिम्फनी परियोजनाओं में परीक्षण कर सकते हैं।
Jan Fabry

अच्छा इनपुट, मुझे नहीं पता था कि :-)
phidah

9
सिद्धांत कार्यान्वयन मुझे अधिक जटिल लगता है। इकाई जाओ प्रबंधन प्राप्त भंडार ... यह और वह
SoWhat

1
सिद्धांत जटिल हो रहा है ... बस notorm जाने का रास्ता है
गीतोमिलो

40

मैं पक्षपाती हूं, क्योंकि मैं प्रोपेल की अगली रिलीज पर थोड़ी मदद करता हूं, लेकिन आपको इस बात पर विचार करना चाहिए कि प्रोपेल वास्तव में पहले ओआरएम उपलब्ध था, तब थोड़ा सा पिछड़ गया जब डॉक्ट्रिन बन गया, लेकिन अब फिर से सक्रिय विकास हुआ है। सिम्फनी 1.3 / 1.4 प्रोपेल 1.4 के साथ आता है, जहां अधिकांश तुलनाएं प्रोपेल 1.3 पर रुकती हैं। साथ ही, प्रोपेल (1.5) की अगली रिलीज़ में बहुत सुधार होंगे, विशेष रूप से आपके क्राइटेरिया के निर्माण में (परिणामस्वरूप आपको लिखने के लिए कम कोड)।

मुझे प्रोपेल पसंद है क्योंकि यह डॉक्ट्रिन की तुलना में कम जटिल लगता है: अधिकांश कोड कुछ उत्पन्न वर्गों में है, जबकि डॉक्ट्रिन ने बहुत सारी कक्षाओं में कार्यक्षमता को विभाजित किया है। मुझे उन पुस्तकालयों की अच्छी समझ होना पसंद है जिनका मैं उपयोग कर रहा हूं (बहुत "जादू" नहीं), लेकिन निश्चित रूप से, मुझे प्रोपेल के साथ अधिक अनुभव है, इसलिए हो सकता है कि डॉक्ट्रिन पर्दे के पीछे इतना जटिल न हो। कुछ का कहना है कि प्रोपेल तेज़ है, लेकिन आपको इसे अपने लिए जाँचना चाहिए, और विचार करना चाहिए कि क्या यह अन्य मतभेदों को दूर करता है।

शायद आपको विभिन्न फ्रेमवर्क के लिए सिम्फनी प्लगइन्स की उपलब्धता पर भी विचार करना चाहिए। मेरा मानना ​​है कि प्रोपेल का यहाँ एक फायदा है, लेकिन मुझे नहीं पता कि कितने सूचीबद्ध प्लगइन्स अभी भी सिम्फनी के नवीनतम संस्करण के साथ अद्यतित हैं।


4
Propel 1.5 में नए क्वेरी सुधार वास्तव में बहुत अच्छे हैं।
टॉम

23

यह व्यक्तिगत प्राथमिकता पर आता है। मैं प्रोपेल का उपयोग करता हूं क्योंकि (अन्य चीजों के अलावा) मुझे यह तथ्य पसंद है कि सब कुछ का अपना ठोस गेटटर और सेटर विधि है। सिद्धांत में, यह मामला नहीं है।

प्रोपेल:

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

सिद्धांत:

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

मुझे गेटर्स और सेटर पसंद करने का कारण यह है कि अगर मुझे ज़रूरत है तो मैं उनमें सभी तरह के तर्क रख सकता हूँ। लेकिन यह सिर्फ मेरी निजी पसंद है।

मुझे यह भी जोड़ना चाहिए कि हालांकि प्रोपेल अतीत में धीमी गति से चल रहा था, अब यह फिर से सक्रिय विकास के अधीन है। इसने पिछले कुछ महीनों में कई नए संस्करण जारी किए हैं। प्रोपेल के सबसे हालिया संस्करण में डॉक्ट्रिन के समान "धाराप्रवाह क्वेरी इंटरफ़ेस" शामिल है , इसलिए यदि आप नहीं चाहते हैं तो आपको क्राइटेरिया का उपयोग नहीं करना होगा।


7
डॉक्ट्रिन में आप प्रत्येक प्रॉपर्टी के लिए सेटर और गेटर्स को ओवरराइड कर सकते हैं और कस्टम लॉजिक भी हो सकते हैं (देखें doctrine-project.org/documentation/manual/1_2/en/… - - ATTR_AUTO_ACCOROR_OVERRIDE के लिए सर्च करें ताकि संबंधित सेक्शन मिल सके)
मारेक करबारज़

यह ठीक लग रहा है, लेकिन आप अभी भी कॉल करके संपत्ति सेट करते हैं: $ x-> प्रोपनाम = 'एबीसी'; यह समस्याग्रस्त है क्योंकि यह कई मापदंडों को पारित करने का समर्थन नहीं करता है।
lo_fye

20

यह ध्यान देने योग्य सिद्धांत 2 है विकास में वर्तमान में जारी किया गया [एड] और कार्यों लगभग पूरी तरह से सिद्धांत 1. यह सक्रिय रिकॉर्ड के बजाय डेटा मैपर पैटर्न पर निर्भर करता है की वर्तमान स्थिर संस्करण से अलग है, और संभाल के हठ करने के लिए एक 'इकाई प्रबंधक' का उपयोग करता है तर्क। जब यह जारी किया जाता है तो यह जावा के हाइबरनेट के करीब होता है (सिद्धांत 1 अधिक है जैसे रेल्स एक्टिवरॉर्ड)।

मैं डॉक्ट्रिन 2 के अल्फा रिलीज के साथ विकसित हो रहा हूं, और यह कहना चाहिए कि यह डॉक्ट्रिन 1 के ऊपर सिर और कंधे हैं (बस मेरी राय है, और मैंने कभी प्रोपेल का इस्तेमाल नहीं किया है)। संभावनाएं अच्छी हैं कि जब यह जारी होगा तो डॉक्ट्रिन समुदाय इसकी ओर बढ़ेगा।

मैं आपको Doctrine की जांच करने के लिए प्रोत्साहित करूंगा, लेकिन यदि आप उस सक्रिय रिकॉर्ड शैली को पसंद करते हैं जिसे Propel और Doctrine अभी उपयोग करते हैं, तो आप शायद Propel के साथ रहना चाहते हैं।


4
डॉक्ट्रिन 2 का एक स्थिर संस्करण हाल ही में जारी किया गया था। doctrine-project.org/blog/doctrine2-released
ट्रेवर एल्ड्रेड

5

दो संदर्भ कुछ हद तक पुराने हैं, इसलिए आप कुछ सामान्यताओं को कवर करते हैं, मूल रूप से आपको अपने अनुभव का मूल्यांकन फ्रेमवर्क के साथ करना होगा जैसे कि, सिद्धांत के लिए एक बड़ी कमी आईडीई की अक्षमता है जो आपको उस प्रोपेल में ऑटो-कोड की सुविधा देती है। एक विजेता, कर्व प्रोपेल को सीखना और सिद्धांत अलग-अलग होते हैं, यह प्रोपेल करना आसान होता है, यदि आपकी परियोजना को जटिल डेटा मॉडल का उपयोग करने के सिद्धांत का उपयोग करने की आवश्यकता होगी, यदि आप एक ORM के साथ जल्दी से काम करना चाहते हैं जो सबसे अच्छा प्रलेखित है और प्रोपेल में अधिक समर्थन पाता है इंटरनेट का उपयोग, अधिक परिपक्व है और मेरा मानना ​​है कि सबसे अधिक उपयोग किया जाता है।

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


सिम्फनी की दुनिया में ऐसा लगता है कि डॉक्ट्रिन निश्चित रूप से सबसे अधिक उपयोग किया जाता है - विशेष रूप से नई परियोजनाओं के लिए। बेशक बहुत सारे sf 1.0 प्रोजेक्ट हैं जो अभी भी प्रोपेल का उपयोग करते हैं क्योंकि डॉक्ट्रिन 1.1 तक सिम्फनी के लिए उपलब्ध नहीं था।
फिदह

5

मैं प्रोपेल 1.6 का उपयोग करने का सुझाव दूंगा जो IDE के स्वतः पूर्ण कार्य के लिए बेहतर है।


26
-1 एक IDE की स्वतः पूर्णता एक तकनीकी विकल्प का कारण नहीं होनी चाहिए
क्लेमेंट हर्रेमैन

14
@ClementHerreman मैं मानता हूँ यह नहीं होना चाहिए मापदंड है, लेकिन मेरा मानना है कि कैसे उत्पादक एक एक विशेष तकनीक के साथ किया जा सकता है निश्चित रूप से होना चाहिए एक यह चुनने के लिए कारण। और पूरे सम्मान के साथ इसलिए मैं आपके अपमान से असहमत हूं ... चाहे आप जवाब से सहमत हों, यह "गलत" (या यह है?) नहीं है, और यह कुछ उपयोग का है (जब तक कि यह गलत नहीं है, किस मामले में? , आपको यह बताना चाहिए)।
14

2
IMO यदि आपकी उत्पादकता सॉफ्टवेयर की गुणवत्ता, सहजता और निरंतरता के बजाय स्वतः पूर्णता से अधिक सुधरी है, तो कुछ अजीब हो रहा है। कोडिंगहोरर देखें / blog/2009/01/… । लेकिन आप सही हैं, कुछ बिंदु पर यह उत्तर गलत नहीं है , बस पर्याप्त नहीं है, शायद अच्छा भी नहीं है।
क्लेमेंट हेरमैन

1
@ClementHerreman, अगर मददगार नहीं है, तो अब इसका इस्तेमाल नहीं करते;), +1
amd

क्या इस पर कोई प्रतिक्रियाएँ हैं? यह तरीका पुराना है।
Qiniso

2

मैं PHP 5 नॉन-फ्रेमवर्क ORM का उपयोगकर्ता नहीं हूँ, लेकिन यहाँ कुछ अच्छे तुलनात्मक पद हैं (यदि आपने उन्हें अभी तक नहीं देखा है तो):

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

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

दोनों सिम्फनी के लिए ORM की एक नई पीढ़ी के रूप में डॉक्ट्रिन के लिए पसंदीदा शामिल हैं।


1
रिकॉर्ड के लिए, यह तुलना पूरी तरह से पुरानी है - प्रोपेल का वर्तमान संस्करण पीडीओ का उपयोग करता है, कई-से-कई संबंधों का समर्थन करता है, और महान दस्तावेज हैं। इसके अलावा विचार करने योग्य: हम में से कुछ लोग DQL जैसी मालिकाना क्वेरी भाषाओं पर वर्बोज़ मापदंड-बिल्डर क्वेरी-शैली पसंद करते हैं - इसमें IDE समर्थन है, और यह एक वर्ग है, इसलिए आप इसे बढ़ा सकते हैं। मैं अभी भी चुनने की कोशिश कर रहा हूं, लेकिन मैं डॉक्ट्रिन पर प्रोपेल के लिए बहुत सारे प्लसस देखता हूं, अगर आपको स्थिर कोड-पीढ़ी से कोई फर्क नहीं पड़ता है और मालिकाना क्वेरी-भाषा के विपरीत "वास्तविक" PHP कोड के फायदे देख सकते हैं , जो सिर्फ एक आईडीई के लिए तार है।
mindplay.dk

2

कई सालों तक दोनों का उपयोग करने के बाद मैं प्रॉपेल 2 से लेकर डॉक्ट्रिन तक को प्राथमिकता देता हूं कि कैसे आप अपने क्वेरी लॉजिक का निर्माण करते हैं। सिद्धांत के रूप में गहराई में है क्योंकि यह मिल सकता है और इसके कई पहलुओं का प्रबंधन गहराई के स्तर से मेल खाता है। प्रोपेल मुझे लगता है कि क्वेरी इंटरैक्शन के निर्माण और प्रबंधन के लिए अधिक तरल और ऑब्जेक्ट संचालित तरीका है।

मेरे लिए इसने मॉडल में कम कोड और तर्क को संसाधित / कैसे किया जा सकता है, के आसपास और अधिक संरचनाओं का नेतृत्व किया। इसके परिणामस्वरूप सामान्य कार्यक्षमता के रूप में कई इंटरैक्शन का निर्माण हुआ। (डेटाबेस के साथ आप जो कुछ भी करेंगे उसके 90% के बाद बस कुछ हद तक क्रूड ऑपरेशन होगा।)

अंत में, दोनों शक्तिशाली, प्रबंधनीय हैं और काम पूरा कर लेंगे। मेरी व्यक्तिगत परियोजनाएं और ब्याज, प्रोपेल ओआरएम 2 और भविष्य की परियोजनाओं का उपयोग करते हैं, अगर अभी भी PHP में लिखा गया है तो वह मार्ग जाएगा।

मैं पिछले 3-4 वर्षों से दैनिक आधार पर दोनों का उपयोग कर रहा हूं।


1

मैं DbFinder प्लगइन का उपयोग करने का सुझाव देता हूं । यह वास्तव में एक बहुत शक्तिशाली प्लगइन है जो दोनों का समर्थन करता है, और काफी अच्छा शक्तिशाली है। मैं वास्तव में इसे या तो बेहतर उपयोग करना पसंद करता हूं।


@ माइक: धन्यवाद, प्लगइन के बारे में नहीं पता था, लेकिन ऐसा लगता है कि यह केवल Sf1.2 का समर्थन करता है। मैं अंत में डॉक्ट्रिन के साथ जा रहा था, ऐसा लगता है कि यह सही विकल्प था, हालांकि अधिक जटिल सामान के लिए प्रत्यक्ष एसक्यूएल लिखना आवश्यक है।
टॉम

-2

अगर मैं गलत नहीं हूँ, दोनों ORM XML- आधारित स्कीमा का उपयोग करते हैं, और इन स्कीमा की परिभाषा बनाना बहुत बोझिल है। यदि आप धाराप्रवाह शैली के साथ एक PHP- आधारित सरल स्कीमा की आवश्यकता है। आप LazyRecord की कोशिश कर सकते हैं https://github.com/c9s/LazyRecord यह स्वचालित माइग्रेशन और अपग्रेड / डाउनग्रेड स्क्रिप्ट जनरेटरों का समर्थन करता है। और सभी वर्ग फाइलें रनटाइम लागत के बिना सांख्यिकीय रूप से उत्पन्न होती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.