2012-03-14 16 views
10

Doctrine2 का उपयोग करके डुप्लिकेट प्रविष्टियों पर अनदेखा कैसे करें?Doctrine2/Symfony2 में डुप्लिकेट प्रविष्टियों पर अनदेखा डालें

त्रुटि उदाहरण:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'symfony' for key 'UNIQ_389B783389B783' 
+0

आप क्या कर सकते हैं के लिए प्रेरित करते हैं: (findByKeyOrCreate की तरह एक विधि) बनाने के लिए एक विद्यमान इकाई लौटने यदि कोई हो या एक नया एक नहीं तो निर्माण। – gremo

+0

यदि आपको इसकी आवश्यकता नहीं है, तो उस फ़ील्ड से '@ अद्वितीय 'अनुक्रमणिका हटाएं। –

+0

स्पष्ट रूप से मुझे इसकी आवश्यकता है ... – seferov

उत्तर

11

यह सिद्धांत के उपद्रवों में से एक है, INSERT/UPDATE अनदेखा करना संभव नहीं है, ऐसी विधियां बनाने की तरह काम कर रहे हैं जो जांचते हैं कि पंक्ति मौजूद है या नहीं, और यदि ऐसा होता है तो बस इसे छोड़ दें।

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

यदि उपरोक्त विकल्पों में से कोई भी आपके लिए काम नहीं करता है, तो आखिरकार मैं बैच प्रोसेसिंग करने के लिए कच्चे एसक्यूएल लिखना समाप्त करता हूं और मैं सिद्धांत का उपयोग नहीं करता हूं, यह तेजी से समाप्त होता है और INSERT/UPDATE को अनदेखा करने की क्षमता यह कोई ब्रेनर नहीं है।

9

तुम हमेशा अपवाद पकड़ कर सकते हैं और फिर इसे अनदेखा। बस जागरूक रहें कि जब इकाई प्रबंधक अपवाद उठाता है, तब उस इकाई के दौरान इकाई प्रबंधक का उपयोग नहीं किया जा सकता है।

7

में Symfony 3 आप प्रबंधक रीसेट और UniqueConstraintViolationException अपवाद को पकड़ने के बाद Doctrine वस्तु की resetManager() विधि को फोन करके इसके साथ काम जारी रख सकते हैं।

यहाँ एक उदाहरण है:

try { 
    $em = $this->getDoctrine()->getManager(); 
    $entity = Product::create() 
    ->setTitle('Some title') 
    ->setUrl('http://google.com'); 
    $em->persist($entity); 
    $em->flush(); 
} 
catch (UniqueConstraintViolationException $e) { 
    $this->getDoctrine()->resetManager(); 
} 
+1

अच्छा शेयर! (यानी रीसेट प्रबंधक()) –

+1

मुझे उस प्रकार के एक और हालिया उत्तर में दिलचस्पी होगी। resetManager() अब बहिष्कृत है। – Moonchild

+0

यदि आप सिम्फनी 3/4 का उपयोग कर रहे हैं 'संगीतकार को सिम्फनी/प्रॉक्सी-प्रबंधक-पुल की आवश्यकता है' –

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