2012-01-12 17 views
6

मुझे वास्तव में कोडइग्निटर के सक्रिय रिकॉर्ड पसंद हैं और यह मेरे सभी आवश्यक डेटाबेस प्रश्नों को कितनी अच्छी तरह से अनुमति देता है।सिद्धांत सक्रिय रिकॉर्ड के ऊपर क्या जोड़ता है - कोडइग्निटर?

लेकिन मैं डॉक्टरेट जैसे ओआरएम के बारे में भी पढ़ रहा हूं। जब मैं सिद्धांत के दस्तावेज़ को पढ़ता हूं, तो यह सक्रिय रिकॉर्ड के रूप में उपयोग करने के लिए स्पष्ट नहीं लगता है, और मैं नहीं देख सकता कि यह बेहतर बनाता है (यदि यह है)।

सक्रिय रिकॉर्ड के साथ सिद्धांत क्या संभव नहीं है? क्या सिद्धांत एक ही काम को तेज़, आसान, बेहतर बनाता है? या यह चीजें करता है सक्रिय रिकॉर्ड नहीं कर सकता है?

सर्वश्रेष्ठ होगा अगर लोग कार्य के उदाहरण पोस्ट कर सकें जो दिखा रहे हैं कि हम किस बारे में बात कर रहे हैं।

धन्यवाद, मैथ्यू

+0

सिद्धांत एक पूर्ण ओआरएम है जो सक्रिय रिकॉर्ड पैटर्न लागू करता है। कोडइग्निटर की सक्रिय रिकॉर्ड क्लास पैटर्न के "संशोधित" संस्करण के आधार पर एक क्वेरी बिल्डर का अधिक है। – birderic

+0

हाय बिरडेरिक, त्वरित उत्तर के लिए धन्यवाद। क्या आप मुझे एक उदाहरण दे सकते हैं जहां यह खेल में आएगा? क्या हम सीआरयूडी परिचालन जैसी चीजों के बारे में बात कर रहे हैं? – MatthewSchenker

+0

मैं एक लंबा उत्तर लिखूंगा। मुझे सिद्धांत के साथ कोई अनुभव नहीं है लेकिन मैं दोनों की तुलना करने के लिए अपनी पूरी कोशिश करूंगा। – birderic

उत्तर

9

सिद्धांत एक पूर्ण ORM कि सक्रिय रिकॉर्ड पैटर्न को लागू करता है। कोडइग्निटर की सक्रिय रिकॉर्ड क्लास एक क्वेरी बिल्डर/डेटाबेस रैपर है जो पैटर्न के "संशोधित" संस्करण पर आधारित है।

अस्वीकरण: मैंने कभी भी सिद्धांत का उपयोग नहीं किया है। मैं अपनी समझ के आधार पर कोडइग्निटर के सक्रिय रिकॉर्ड कार्यान्वयन और सिद्धांत के बीच मतभेदों को चित्रित करने के लिए अपना सर्वश्रेष्ठ प्रयास करूंगा।

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

आप मूल रूप से सक्रिय रिकॉर्ड तरीकों का उपयोग कर क्वेरी निर्माण कर रहे हैं:

CodeIgniter के सक्रिय रिकॉर्ड वर्ग का उपयोग करना, आप इस तरह एक मॉडल को लागू कर सकते हैं। यह देखना आसान है कि कैसे प्रत्येक विधि (where(), get(), आदि) कच्चे एसक्यूएल के लिए मानचित्र। $this->db->query() के विपरीत सक्रिय रिकॉर्ड विधियों का उपयोग करने का लाभ यह है कि CodeIgniter आपके द्वारा उपयोग किए जा रहे डेटाबेस ड्राइवर के आधार पर प्रत्येक क्वेरी को संकलित करता है। इसके अलावा, कोडइग्निटर के सक्रिय रिकॉर्ड कार्यान्वयन वास्तव में बहुत कुछ नहीं करता है। आपको जो भी प्रश्न चाहिए, आपको बनाना होगा। मुझे उम्मीद है कि मैंने सचित्र किया है कि कैसे सक्रिय रिकॉर्ड विधियां क्वेरी बिल्डर के समान होती हैं।

ध्यान दें कि निम्न नमूना कोड गलत हो सकता है। सिद्धांत का प्रयोग, आप इस तरह एक मॉडल हो सकता है:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

यह सिर्फ सतह खरोंच है:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

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

ध्यान दें कि सिद्धांत में अपना स्वयं का क्वेरी बिल्डर शामिल है, इसलिए एक तरह से यह कोडइग्निटर का सक्रिय रिकॉर्ड करता है, और भी बहुत कुछ करता है।

सिद्धांत का उपयोग करना सक्रिय रिकॉर्ड पैटर्न के रेल के कार्यान्वयन पर केकपीएचपी या रूबी के समान है। आप पैटर्न में अतिरिक्त अंतर्दृष्टि के लिए वहां एक नज़र डाल सकते हैं। यदि आप CodeIgniter पृष्ठभूमि से आ रहे हैं तो केकपीएचपी के उदाहरणों को पचाने में विशेष रूप से आसान हो सकता है।

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

+1

बिर्डेरिक, इस प्रतिक्रिया के लिए कृपया आपको धन्यवाद। यह मुझे देखने में मदद करता है कि मैं क्या कर रहा था। मैं सिम्फनी के डेटाबेस वर्ग का भी अध्ययन कर रहा हूं, और यह केकपीएचपी विधियों की तरह लगता है। मुझे यह जानकर खुशी हो रही है कि दोनों विधियां एक ही समग्र लक्ष्यों को प्राप्त कर सकती हैं, भले ही वे अलग-अलग हों। – MatthewSchenker

+0

सिद्धांत 2.x सक्रिय रिकॉर्ड का उपयोग नहीं करता है। यह डेटा मैपर पैटर्न का उपयोग करता है। –

18

सबसे पहले, आप किस सिद्धांत के बारे में बात कर रहे हैं, 1 या 2?
एक बड़ा अंतर है। एकमात्र चीज जो दोनों में समान है वह यह है कि वे दोनों पूर्ण ओआरएम हैं। अन्यथा वास्तव में दोनों के बीच कोई संबंध नहीं है।

सिद्धांत 1 ActiveRecords पर आधारित है, सिद्धांत 2 पर डाटा नक्शाकार पैटर्न आधारित है।
दोनों एक ही काम कर सकते हैं, लेकिन दोनों के बीच कुछ महत्वपूर्ण अंतर हैं।

आम तौर पर डेटा मैपर कम "डेवलपर-अनुकूल" है लेकिन बेहतर प्रदर्शन होना चाहिए। क्यूं कर? असल में यह बहुत आसान है। सक्रिय रिकॉर्ड के साथ प्रत्येक इकाई अपने आसपास "सब कुछ", अन्य संस्थाओं के साथ संबंध आदि जानता है। डेटा मैपर के साथ, संस्थाएं गूंगा और हल्के हैं, एक केंद्रीय इकाई (EntityManager/Doctrine2 में UnitOfWork) है जो सभी संबंध मैपिंग को संभालती है। तो स्मृति उपयोग और प्रदर्शन के मामले में डेटा मैपर तेज होना चाहिए।
सिद्धांत लोग कहते हैं कि सिद्धांत 2 कम से कम 50% तेज है कि सिद्धांत 1 (अन्य अंतर भी हैं, न केवल डिजाइन पैटर्न)।

यदि आप इसके लिए महसूस करते हैं, तो आप ActiveRecords को Doctrine2 डेटा मैपर पर भी कार्यान्वित कर सकते हैं। इस blog post पर देखें। मैं जितना संभव हो उतना छोटा कोड रखने के लिए विकास चरण के लिए इस दृष्टिकोण का उपयोग कर रहा हूं। एक बार जब यह उत्पादन में आता है तो मैं अतिरिक्त ActiveRecords परत, और Doctrine2 के डिफ़ॉल्ट डेटा मैपर पर रोलबैक मार दूंगा।

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

शायद मुझे कुछ गलत मिला, लेकिन इस तरह मैं इसे समझ गया।

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

+0

ZolaKt, आपके उत्तर के लिए धन्यवाद। मैं सबकुछ के नवीनतम संस्करणों के बारे में बात कर रहा हूं। मुझे उन अतिरिक्त विशेषताओं को पसंद है जो आप सिद्धांत के लिए वर्णन करते हैं। आम तौर पर, मुझे वास्तव में कोडइग्निटर पसंद है, लेकिन मैं सामान्य रूप से ढांचे के लिए नया हूं। ऐसा लगता है कि कोडइग्निटर के सक्रिय रिकॉर्ड क्लास को मास्टर करने के लिए मेरा सबसे अच्छा तरीका होगा, फिर बाद में कोडइग्निटर के भीतर सिद्धांत का उपयोग करना देखें। – MatthewSchenker

+0

यह पूरी तरह से व्यक्तिपरक है, लेकिन यदि आप ढांचे को सीखने की योजना बना रहे हैं तो कोहाना को देखें। यह कोडइग्निटर की तुलना में अन्य पुस्तकालयों के एकीकरण के साथ थोड़ा और अधिक लचीला डिजाइन है। नवीनतम संस्करण ठीक हैं, लेकिन जैसा कि मैंने कहा है कि ये दो अलग-अलग पैटर्न पर 2 पूरी तरह से अलग परियोजनाएं हैं। यदि आप डिफ़ॉल्ट सक्रिय रिकॉर्ड ORM के साथ "छोटी" प्रोजेक्ट स्टिक कर रहे हैं। वे लगभग सभी सिद्धांत कर सकते हैं, हालांकि कुछ चीजें मैन्युअल रूप से की जानी चाहिए। एक बात मैंने ध्यान में रखी, बहुत ही कमजोर ओआरएम विरासत का समर्थन करते हैं, इसलिए अगर आपको ऐसा कुछ मिलता है जो ऐसा कर सकता है, जैसे सिद्धांत। – ZolaKt

+0

सलाह का एक और टुकड़ा। इससे पहले कि आप तय करें कि किस का उपयोग करना है, कुछ पढ़ने और कोशिश कर रहे हैं। कोडइग्निटर ओआरएम को अपने आप को सीमित न करें, कुछ अच्छे PHP सक्रिय रिकॉर्ड ORM हैं। पैटर्न के बारे में सब कुछ। यदि आप एक सक्रिय रिकॉर्ड ओआरएम जानते हैं तो आप किसी अन्य समय में अन्य को जानेंगे। डेटा मैपर के लिए भी चला जाता है। उदाहरण के लिए यदि आप सिद्धांत जानते हैं तो आपको पता चलेगा (एन) हाइबरनेट। यदि आप तय करते हैं कि आप डेटा मैपर पर सक्रिय रिकॉर्ड पसंद करते हैं, तो आप प्रोपेल भी देख सकते हैं। सक्रिय रिकॉर्ड के आधार पर एक पूर्ण ओआरएम। यदि आप सभी "फैंसी" सुविधाओं को चाहते हैं तो मैंने सिद्धांत के लिए एकमात्र PHP विकल्प देखा है – ZolaKt