2010-08-18 9 views
59

मैं सिद्धांत 2 ओआरएम के साथ अंतिम सम्मिलित आईडी कैसे प्राप्त कर सकता हूं? मुझे यह सिद्धांत के दस्तावेज़ीकरण में नहीं मिला, क्या यह भी संभव है?सिद्धांत 2 के साथ अंतिम डालने आईडी प्राप्त करें?

+0

अपनी डालने के अंत में इसे आज़माएं ... आईडी वापस लौटें-> id; – Manie

उत्तर

140

मैं पिछले डालने आईडी प्राप्त करने के लिए फ्लश करने के बाद इस का उपयोग करने के लिए किया था:

$em->persist($user); 
$em->flush(); 
$user->getId(); 
+2

इसका उपयोग कर सकते हैं। त्रुटि प्राप्त करना अपरिभाषित विधि पर कॉल करें \ Myity \ Test :: getId() "मेरी परियोजना" –

+0

@ noobie-php में आपको अपने आईडी के लिए एक सार्वजनिक गेटर परिभाषित करने की आवश्यकता है (यदि यह एक निजी है तो यह होना चाहिए) – cheesemacfly

+0

@cheesemacfly : मैंने इसे पहले से हल किया है कि यह त्रुटि उत्पन्न होती है (मेरे परिदृश्य में) जब हम किसी भी कारण से फ्लश() को असमर्थ करने में असमर्थ होते हैं, तो फ्लश() को सफलतापूर्वक प्राप्त किया जाता है() काम करना शुरू कर देता है, मानते हैं कि गेटर और सेटर्स यहां कोई समस्या नहीं हैं –

9

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

29

आप इकाई प्रबंधक की निरंतर विधि को कॉल करने के बाद आईडी तक पहुंच सकते हैं।

$widgetEntity = new WidgetEntity(); 
$entityManager->persist($widgetEntity); 
$entityManager->flush(); 
$widgetEntity->getId(); 

आपको इस आईडी प्राप्त करने के लिए फ्लश करने के लिए जरूरत करना

सिंटेक्स त्रुटि फिक्स: $ इकाई के बाद अर्ध-कॉलन जोड़ा गया-> फ्लश() कहा जाता है।

+6

मुझे मूल्य वापस पाने के लिए फ़्लश करना पड़ा। दृढ़ता से पर्याप्त नहीं था, क्योंकि जब तक आप फ्लश नहीं करते हैं तब तक आइटम डेटाबेस में वास्तव में लिखे नहीं जाते हैं। –

3

प्रश्न का उत्तर देने में थोड़ा देर हो चुकी है। लेकिन,

यदि यह एक MySQL डेटाबेस

$doctrine_record_object->id काम करता है, तो AUTO_INCREMENT डेटाबेस में और अपनी मेज परिभाषा परिभाषित किया गया है चाहिए।

17

आप दिखाया गया है here संस्थाओं लेकिन मूल निवासी एसक्यूएल का उपयोग नहीं कर रहे हैं तो आप पिछले डाला आईडी प्राप्त करने के लिए जिन्हें आप नीचे देख सकते हैं:

$entityManager->getConnection()->lastInsertId() 

ऐसे PostgreSQL के रूप में दृश्यों के साथ डेटाबेस के लिए कृपया नहीं आप कर सकते हैं कि अनुक्रम नाम को lastInsertId विधि के पहले पैरामीटर के रूप में प्रदान करें।

$entityManager->getConnection()->lastInsertId($seqName = 'my_sequence') 

अधिक जानकारी के लिए GitHub here और here पर कोड पर एक नज़र डालें।

+0

यह हर डीबीएमएस के साथ काम नहीं कर सकता है। उदाहरण के लिए यह पोस्टग्रेज़ (अनुक्रमों के कारण) के साथ काम नहीं करता है –

+0

बहुत बढ़िया !! मैंने इस छोटे स्निपेट की तलाश में घंटों बिताए। – MikeGA

+4

@ paul.ago आपको केवल अनुक्रम का नाम जानने की आवश्यकता है, उदाहरण के लिए: 'lastInsertId (' articles_id_seq ') ' – ChocoDeveloper

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