2012-07-14 14 views
17

सिद्धांत का उपयोग करते समय, मैंने देखा कि, किसी इकाई को हटाने के लिए, मुझे उस इकाई को दिए गए पैरामीटर (नाम, आईडी आदि) द्वारा पुनर्प्राप्त करने की आवश्यकता है और फिर निकालें विधि को कॉल करें। दूसरी तरफ, क्वेरी में, मैं सिर्फ हटाई गई क्वेरी निष्पादित कर सकता हूं।सिद्धांत इकाई हटाएं क्वेरी हटाएं, प्रदर्शन तुलना

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

उत्तर

38

Doctrine2 में आप प्रॉक्सी ऑब्जेक्ट पर डिलीट को कॉल कर सकते हैं, जो डेटाबेस से लोड नहीं होता है। बस एक "डमी" वस्तु, की तरह कुछ बनाने के लिए:

$user = $em->getPartialReference('model\User', array('id' => $id)); 
$em->remove($user); 

यह प्रारंभिक क्वेरी की आवश्यकता नहीं है, लेकिन मैं काफी यकीन है कि अगर सिद्धांत अभी भी यह आंतरिक रूप से करता है fush पर नहीं कर रहा हूँ। मैं इसे एसक्लॉग में नहीं देखता हूं।

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

संपादित करें:

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

दूसरी तरफ, प्रॉक्सी आलसी लोडिंग के साथ काम करते हैं, और आंशिक वस्तुओं की समस्याओं को साझा नहीं करते हैं। तो मैं दृढ़ता से getPartialReference विधि का प्रयोग करेंगे सुझाव देते नहीं करने के बजाय आप की तरह कुछ कर सकते हैं:

$user = $em->getReference('model\User', $id); 
$em->remove($user); 

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

+1

जानकारी और स्पष्टीकरण के लिए धन्यवाद – Rana

4

हो गया! मेरे लिए यह इस लाइन लाइन 3:

$user = $em->getReference('model\User', $id); 
$em->remove($user); 
$em->flush(); 
संबंधित मुद्दे