2009-07-15 11 views
22

में "अपडेट होने पर अपडेट" लागू करना मैं एक लेनदेन में INSERT OR UPDATE IF EXISTS करने की कोशिश कर रहा हूं।सिद्धांत ओआरएम

में

mysql, मैं आम तौर पर DUPLICATE KEY ("नकली चाबी पर अद्यतन"।) का प्रयोग करेंगे मैं इस समस्या को विभिन्न SQL वेरिएंट और उप प्रश्नों का उपयोग करने के कई समाधान के बारे में पता है, लेकिन मैं इस लागू करने के लिए कोशिश कर रहा हूँ सिद्धांत में (PHP ओआरएम)। ऐसा लगता है कि ऐसा करने के लिए सिद्धांत पद्धतियां होंगी क्योंकि यह इतना फीचर पैक है, लेकिन मुझे कुछ भी नहीं मिला है। क्या इस तरह की चीज किसी कारण से PHP ओआरएम पैकेज का उपयोग कर समस्या है? या किसी भी डॉक्टर के विशेषज्ञों को पता है कि हैक्स या किसी भी माध्यम से इसे कैसे प्राप्त किया जाए?

+0

मैंने इस कार्यक्षमता को लागू करने के लिए एक प्लगइन पर काम करना शुरू कर दिया है। यह अभी भी प्रारंभिक चरणों में है लेकिन मेरे उपयोग-मामले के लिए परीक्षण और काम कर रहा है। यह यहां उपलब्ध है: https://github.com/m14t/m14tDoctrineRecordPlugin टेस्ट केस, बग रिपोर्ट और पुल अनुरोध स्वागत है। – m14t

+0

मुझे लगता है कि आपको समाधान – Mojtaba

उत्तर

2

सिद्धांत REPLACE INTOreplace() विधि का उपयोग कर समर्थन करता है। यह बिल्कुल ON DUPLICATE KEY UPDATE की तरह काम करना चाहिए जो आप ढूंढ रहे थे।

डॉक्स: Replacing Records

+9

समाधान के रूप में @ pix0r के उत्तर को चिह्नित करना चाहिए, रेप्लेस के साथ एकमात्र समस्या यह प्रतीत होती है कि यह गिरता है और फिर एक नई पंक्ति बनाता है (वास्तविक अद्यतन करने के बजाए), इस प्रकार ऑटो वृद्धि आईडी को छोड़ देता है (इसमें मामला, मेरी प्राथमिक आईडी)। क्या मुझसे कोई चूक हो रही है? उदाहरण के लिए - मेरा ऑटो वृद्धि आईडी 9 है, लेकिन गिनती 3000 है। जब मैं पंक्ति 9 के लिए प्रतिस्थापन करता हूं, तो नई पंक्ति आईडी 3001 होती है। – seans

+0

यह कोई समाधान नहीं है, प्रतिस्थापन एक डिलीट/डालने और ऑटोोन्यूमेरिक बदलता है मूल्य (पूर्व आईडी) – Exos

+0

लिंक ऊपर टूट गया है। –

5

केवल एक चीज मैं के बारे में सोच सकते हैं अगर यह अन्यथा नई इकाई बनाने मौजूद इकाई के लिए पहले क्वेरी करने के लिए है।

if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/)) 
{ 
    $entity = new Foo(); 
} 
/*do logic here*/ 
$entity->save(); 
+13

ऐसा कुछ भी नहीं है जो सुनिश्चित करता है कि पंक्ति क्वेरी और सहेजने के बीच बनाई गई नहीं है। –

+5

क्या यह नहीं है कि लेनदेन के लिए क्या हैं? – chiborg

+1

बहुत खतरनाक, जैसे @IliaJerebtsov ने कहा, एक पंक्ति लगातार और फ्लश के बीच बनाई जा सकती है। इस मामले में आपको शुद्ध एसक्यूएल का उपयोग करने पर विचार करना चाहिए ;-( –

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