2012-05-07 35 views
10

क्या जारी/फ्लश से पहले इकाई आईडी प्राप्त करने का कोई तरीका है? मेरा मतलब है:सिद्धांत 2 - फ्लश से पहले इकाई आईडी प्राप्त करें

$entity = new PointData(); 
$form = $this->createForm(new PointDataType(), $entity); 

अगर मैं कोशिश $ entity-> getId() इस बिंदु पर, यह कुछ भी नहीं देता है।

मैं इसे से काम करना आरंभ कर सकते हैं:

$em->persist($entity); 
$em->flush(); 

(मान $ उन्हें = $ this-> getDoctrine() -> getEntityManager();)

मैं यह कैसे प्राप्त कर सकते हैं?

+0

के बारे में पढ़ें [पहचानकर्ता पीढ़ी रणनीतियों] (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary- चाबियाँ) सिद्धांत के दस्तावेज पृष्ठों पर। – Crozin

+0

धन्यवाद क्रोजिन। मैंने पहले से ही उन सभी चीजों को पढ़ लिया था। मैं अगली ऑटो इंडेक्स प्राप्त करने की कोशिश नहीं कर रहा हूं। यह असफल हो जाएगा यदि 2 उपयोगकर्ताओं ने एक साथ उस क्रिया को बुलाया। – Xavi

उत्तर

23

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

यह शायद ही कभी एक अच्छा विचार है, इसलिए आपको सावधान रहना चाहिए।

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

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। – Xavi

+0

हो सकता है कि आप इस कार्य के लिए यूयूआईडी का उपयोग कर सकें, क्योंकि वे व्यावहारिक रूप से अद्वितीय हैं (https://en.wikipedia.org/wiki/Universally_unique_identifier) ​​और उदाहरण के लिए PHP से अग्रिम रूप से जेनरेट किए जा सकते हैं। मुझे उन्हें बहुत पसंद नहीं है, लेकिन यह एक अच्छा समाधान होगा। – JorgeeFG

+1

@JorgeeFG - बिल्कुल। यूयूआईडी इस उपयोग के मामले के लिए एक महान हैं। सालों से मैंने यह जवाब लिखा है, मैंने यूयूआईडी को इकाइयों के लिए पहचानकर्ता के रूप में पसंद करना शुरू कर दिया है। https://github.com/ramsey/uuid उन्हें उत्पन्न करने के लिए एक सुंदर ठोस लाइब्रेरी है, और https://github.com/ramsey/uuid-doctrine एक सिद्धांत प्रकार कार्यान्वयन प्रदान करता है जो अच्छी तरह से काम करता है। – timdev

1

आप @ पोस्टस्टर्सिस्ट एनोटेशन का उपयोग कर सकते हैं। इसके साथ एनोटेटेड एक विधि फ्लश समाप्त होने से ठीक पहले निष्पादित की जाएगी और इकाई आईडी पहले से ही उपलब्ध है।

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#annref-postpersist