2011-01-18 12 views
5

के लिए एक साधारण ओआरएम या डीबीएएल की आवश्यकता है मैं मौजूदा PHP एप्लिकेशन को विस्तारित करने पर काम कर रहा हूं। दुर्भाग्य से मेरे लिए, मौजूदा ऐप एक गड़बड़ है। यह कच्चे mysql_ * कॉल के साथ सभी स्पेगेटी कोड है। कराहना। कोई रास्ता नहीं है कि मैं उन हिस्सों में ऐसा करने जा रहा हूं जो मैं विस्तार कर रहा हूं।मौजूदा PHP एप

तो, मैं डीबीएएल का एक साधारण ओआरएम ढूंढ रहा हूं जिसे मैं आसानी से छोड़ सकता हूं और उपयोग करना शुरू कर सकता हूं। वांछित विशेषताएं:

  • यह मौजूदा डेटाबेस स्कीमा पर काम करना चाहिए। अधिमानतः न्यूनतम या कोई अतिरिक्त विन्यास के साथ। मौजूदा डेटाबेस स्कीमा मौजूदा PHP कोड (कोई समझदार नामकरण सम्मेलन, सामान्यीकृत नहीं, आदि) के समान गुणवत्ता है। मैं डेटाबेस स्कीमा को एनोटेटेड ऑब्जेक्ट गुणों में मैन्युअल रूप से कनवर्ट करने में दिन नहीं बिताना चाहता हूं, एक ला डॉक्टर 2।
  • यह मौजूदा कच्चे mysql_ * प्रश्नों के साथ काम करने में सक्षम होना चाहिए। मुझे नहीं पता कि स्प्रेट्स मैन्युअल रूप से डाटाबेस में डेटा को मैनिपुलेट कर रहे हैं, लेकिन मुझे लगता है कि यह सुंदर नहीं है, तो डॉक्टर 2 की तरह ओआरएम को हाइड्रेट करना या व्यवहार करना।
  • यह PHP 5.2.x पर चलाना चाहिए। मैं PHP 5.3 का उपयोग करने के लिए प्यार प्यार करता हूं लेकिन मुझे यह सुनिश्चित करने के लिए स्पेगेटी कोड मैस की मौजूदा 125K लाइनों पर जाने में शून्य रूचि है कि यह PHP 5.3 पर चलता है।
  • रिश्तों की आवश्यकता नहीं है। कुछ स्थानों में मुझे डेटा को रिलेशनल करने की आवश्यकता है, मुझे अतिरिक्त find() या query() या जो भी हो, उसे कॉल करने में खुशी होगी।
  • बोनस पॉइंट्स यदि इसमें कुछ ट्रिगर समर्थन है (उदा। beforeSave, afterSave)। एक आवश्यकता नहीं है, लेकिन बस अच्छा है।

संपादित: किसी मुझे मेरे दुख से बाहर डाल दिया। मुझे अभी पता चला है कि स्पेगेटी कोड की 125 के लाइनें डेटाबेस स्कीमा भी बदलती हैं। उदा।, कहीं भी एक अतिरिक्त विकल्प जोड़ें और पूरी तरह से आल्टर टेबल स्टेटमेंट उड़ान भरना शुरू करें। मैं शायद इस कोडबेस के साथ TheDailyWTF के एक साल के लायक को भर सकता हूं। तो, एक और आवश्यकता:

  • स्वचालित रूप से एक बदलती डेटाबेस स्कीमा से निपटने में सक्षम होना चाहिए (उदा। कॉलम जोड़ना)।

मैं कुछ समाधान देख रहा हूं, लेकिन मुझे यकीन नहीं है कि वे आवश्यकताओं को कितनी अच्छी तरह से काम करेंगे। सिद्धांत 2, RedBeanPhp और सभी की तरह PHP 5.3 की आवश्यकता है, इसलिए वे बाहर हैं। PHP 5.2.x के लिए RedBeanPhp का एक विरासत संस्करण है, लेकिन मुझे नहीं पता कि यह एक गन्दा, मौजूदा डेटाबेस स्कीमा के साथ काम करेगा या नहीं। नोटोरएम डेटा प्राप्त करने के लिए ठीक दिखता है लेकिन मुझे नहीं पता कि यह मौजूदा डेटाबेस स्कीमा के लिए कॉन्फ़िगर किया जा सकता है, और आप आसानी से डेटा को डेटाबेस में कैसे डाल सकते हैं।

आदर्श रूप से मुझे कुछ आसान चाहिए। उदा:

$user = User::find($id); 
$user->name = 'John Woo'; 
$user->save(); 

या:

$articles = ORM::find('article')->where('date' => '2010-01-01'); 
foreach ($articles as $article) { 
    echo $article->name; 
} 

किसी भी सुझाव या यहां तक ​​कि वैकल्पिक समाधान का स्वागत है!

उत्तर

9

मैं का उपयोग करें ... http://github.com/j4mie/idiorm/

यह पेरिस के रूप में एक सक्रिय रिकॉर्ड कार्यान्वयन भी है।

आपके संपादन के संबंध में।बदलते स्कीमा और सिंटैक्स के साथ इडियॉर्म कॉप लगभग आपके प्रश्न में इच्छित प्रकार से मेल खाते हैं।

+1

मैं कुछ हफ्तों के लिए आवेदन में इडियॉर्म और पेरिस जा रहा हूं और मुझे बिल्कुल पसंद है! –

1

आपने सिद्धांत में कितनी अच्छी तरह से देखा? मैं इस तरह की चीजों के लिए सिद्धांत 1.2 का उपयोग कर रहा हूं। सेटअप करने के लिए काफी आसान है, आपको मौजूदा स्कीमा से शुरू करने की अनुमति देता है। यह स्वचालित रूप से उन तालिकाओं के बीच संबंधों को दर्शाता है जिनमें विदेशी कुंजी बाधाएं होती हैं।

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

आपका उदाहरण इस तरह दिखेगा:

/* To just find one user */ 
$user = Doctrine::getTable('User')->findOneById($id); 

/* Alternative - illustrating DQL */ 
$user = Doctrine_Query::create() 
    ->from('User u') 
    ->where('u.id = ?',array($id)) 
    ->fetchOne(); 

$user->name = 'John Woo'; 
$user->save(); 

यह मौजूदा कच्चे mysql_ * प्रश्नों के साथ काम करने में सक्षम होना चाहिए। मुझे नहीं पता कि स्प्रेट्स मैन्युअल रूप से डाटाबेस में डेटा को मैनिपुलेट कर रहे हैं, लेकिन मुझे लगता है कि यह सुंदर नहीं है, तो डॉक्टर 2 की तरह ओआरएम को हाइड्रेट करना या व्यवहार करना।

ठीक है, यह ऑटो-प्रबंधित करने के लिए तकनीकी रूप से असंभव है; एक SQL डेटाबेस बस आपके ORM पर सामान वापस नहीं दबा रहा है, इसलिए पृष्ठभूमि में बदली गई सामग्री को अपडेट करने के लिए, आपको एक अतिरिक्त क्वेरी को एक या दूसरे तरीके से करने की आवश्यकता है। सौभाग्य से, सिद्धांत आपके लिए यह बहुत आसान बनाता है:

/* @var User $user */ 
/* Change a user using some raw mysql queries in my spaghetti function */ 
$this->feedSpaghetti($user->id); 

/* Reload changes from database */ 
$user->refresh(); 
+0

लेकिन क्या होता है जब ऐप का कोई अन्य भाग, अभी भी कच्चे mysql_ * कॉल का उपयोग करता है, सिद्धांत के पीछे डेटा को बदलता है? या बदतर, जब स्कीमा अपने पैरों के नीचे बदल जाती है? जैसे मैंने कहा, ऐप 125 के स्पेगेटी कोड है जिसके पीछे गंभीर रूप से denormalised डेटाबेस है। सबसे बुरा मानो। एक कारक से गुणा करें 2. क्या सिद्धांत इसे संभाल सकता है? –

+0

सुनिश्चित नहीं है कि आप पहले से ही मेरे अपडेट को पढ़ चुके हैं। आपको रिकॉर्ड रीफ्रेश करने की आवश्यकता है, लेकिन हे, एसक्यूएल की प्रकृति के कारण, यह किसी भी ओआरएम में ऐसा होगा। यदि आप पुराने सिद्धांत को पुराना होने से डरते हैं, तो बस इसे रीफ्रेश करें, और इसके फ़ील्ड मान डेटाबेस से पुनः प्राप्त किए जाएंगे। –

संबंधित मुद्दे