2012-12-17 14 views
16

मैं अपने सिद्धांत-एंटिटी में एक मानव-पठनीय आईडी को कार्यान्वित करना चाहता हूं। मैं काम करने और "PRE12-00005" (उपसर्ग और वर्ष के साथ, और प्रत्येक नए वर्ष में 0 से शुरू) जैसे कुछ जोड़ने के लिए डीबी-आईडी रखना चाहता हूं। मैंने कस्टम-आईडी-जेनरेटर जोड़ने की कोशिश की, लेकिन ऐसा लगता है कि सिद्धांत एक इकाई में दो जेनरेट किए गए मानों के साथ काम नहीं कर सकता है।सिद्धांत में दो जनरेटेड वैल्यू

/** 
* @var integer 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
protected $id; 

/** 
* @var string 
* @ORM\Column(name="name", type="string", length=25, unique=true) 
* @ORM\GeneratedValue(strategy="CUSTOM") 
* @ORM\CustomIdGenerator(class="NameGenerator") 
*/ 
protected $name; 

सिद्धांत हमेशा "आईडी" -Field और "नाम" में अशक्त में मेरी जनरेटर से वापसी मान को बचाने के लिए प्रयास करें। क्या इसे लागू करने का कोई और तरीका है?

उत्तर

18

जो मुझे पता है जेनरेटेड वैल्यू रणनीति प्राथमिक कुंजी के लिए आरक्षित है, जिसका अर्थ है कि आप केवल प्रति इकाई एक बार इसका उपयोग कर सकते हैं।

अपनी आवश्यकताओं पर निर्भर करता है आपके पास कुछ विकल्प हालांकि है:

  • तुम हमेशा एक prePersist lifecycle event आप नाम के लिए चाहते इससे पहले कि आप पहली बार जारी रहती है किसी भी मान सेट कर सकते हैं,।

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

  • यदि यह आपके लिए ठीक है कि नाम कुछ समय के लिए डेटाबेस में खाली है, तो पोस्टलोड ईवेंट को कार्यान्वित करना ठीक हो सकता है, जो नाम खाली होने पर नाम भरता है। इस प्रकार आपका एप्लिकेशन हमेशा नाम देखता है (क्योंकि यह या तो डेटाबेस से लोड होता है या पोस्टलोड ईवेंट से भरा होता है) और जब आप प्रारंभिक सहेजने के बाद पहली बार जानकारी जोड़ते या संपादित करते हैं, तो आपका नाम भी बचाया जाएगा

  • यह नाम को सहेजना ठीक नहीं हो सकता है और इसे कुछ cronjob/deamon/queue द्वारा उत्पन्न किया गया है, इसलिए आपके एप्लिकेशन को इससे निपटने की आवश्यकता नहीं है। केवल एक चीज जो आपको करने की आवश्यकता होगी, यह सुनिश्चित कर लें कि एक लापता नाम कुछ खराब नहीं करता है।

  • शायद एक कुंजी उत्पन्न करना ठीक हो सकता है जो प्राथमिक कुंजी पर निर्भर नहीं है और इस प्रकार global event handler द्वारा उत्पन्न किया जा सकता है। आपको निश्चित रूप से इस तरह की घटना हैडलर की कमी है, क्योंकि वह वैश्विक है, हर वस्तु के लिए बुलाया जाता है, इससे कोई फर्क नहीं पड़ता कि यह सही इकाई है।

  • अंतिम, लेकिन कम से कम नहीं, डेटाबेस को इसे संभालने के लिए संग्रहीत प्रक्रियाओं/ट्रिगर्स पर फ़ॉलबैक करना ठीक हो सकता है। इस तरह आपको अपने आवेदन के अंदर इस के साथ गड़बड़ नहीं करना है। लेकिन सावधान रहें, रास्ते पर नुकसान हो सकता है (जैसे डेवलपर इस बारे में भूल रहा है क्योंकि यह कोड में नहीं बल्कि डेटाबेस में है!)।

अन्य तरीके भी हो सकते हैं। मैं जो कहने की कोशिश कर रहा था वह है: गैर-प्राथमिक कुंजी गुणों के लिए जेनरेट वैल्यू का उपयोग न करें!

+0

क्या घटनाओं में ईएम का उपयोग करने का एक अनुशंसित तरीका है? मुझे मैन्युअल में इसके बारे में कुछ भी नहीं मिला, लेकिन शायद समस्या मेरे सिर में ही मौजूद है :-) ... मैं किसी अन्य तरीके से सोचता हूं: संख्यात्मक आईडी हटाएं ... क्या यह व्यावहारिक है या मैं दूसरे में भागूंगा समस्या का? – icksde

+0

मुझे लगता है कि कोई अनुशंसित तरीका नहीं है क्योंकि कोई सामान्य समस्या नहीं है। यह अत्यधिक डोमेन विशिष्ट है और जैसा कि ऊपर देखा गया है, कई समाधान हैं - कुछ विशिष्ट समस्याओं के लिए बेहतर कुछ, कुछ नहीं। संख्यात्मक आईडी के बारे में: आप प्रति समस्याओं में नहीं भागेंगे, लेकिन वर्चर्स कुंजी का उपयोग करते समय आपको डेटाबेस प्रदर्शन में कमी आ सकती है। – Sgoettschkes

+0

लिंक मर चुका है। कृपया रिंकिंक करने का प्रयास करें या – Trix

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

  • कोई संबंधित समस्या नहीं^_^