मुझे समस्या का सामना करना पड़ रहा है, जिसे प्रोग्रामर.स्टैक एक्सचेंज डॉट कॉम पर भी रखा जा सकता है, लेकिन चूंकि यह सिद्धांत और जेडएफ 2 से काफी जुड़ा हुआ है, इसलिए मैंने इसे ऊपर रखना चुना यहा पर। मुझे आपको अपने परिदृश्य में पेश करने दें:विभिन्न इकाई-श्रेणियों के लिए अलग-अलग इकाई-गुणों को कैसे संभालें
- मेरे पास एक ऐसा एप्लिकेशन है जहां उपयोगकर्ता संस्थाएं पोस्ट करते हैं (
BaseEntity
)। BaseEntity
संपत्ति$cagetory
$category
पर निर्भर करता है इकाई हालांकि अतिरिक्त गुण होना आवश्यक है है
अब सरल उदाहरण:
class BaseEntity {
protected $id;
protected $title;
protected $description;
}
class MovieEntity {
protected $id;
protected $title;
protected $description;
protected $airingDateStart; // new property
protected $airingDateEnd; // new property
}
अब मैं आसानी से एक दो कदम फ़ॉर्म्यूलर कर सकता है जहां उपयोगकर्ता पहले अपनी श्रेणी चुनता है और उस पर निर्भर करता है कि EntityClass चुना जाएगा - लेकिन मेरे पास यह नहीं हो सकता है। लेकिन यह अच्छा नहीं है क्योंकि क्या होगा यदि उपयोगकर्ता BaseEntity
-श्रेणी में मूवी डालता है और फिर बाद में इकाई को MovieEntity
में बदलना चाहता है? तो यह विचार वास्तव में एक सुरक्षित विकल्प नहीं है।
अतिरिक्त आवश्यकताओं (सामान और अधिक जटिल बनाने के लिए)
- श्रेणियाँ के साथ ही संस्थाओं सिद्धांत द्वारा नियंत्रित किया जा है
- प्रत्येक
Category
एक भीModule
- के माध्यम से आवेदन करने के लिए प्रदान की जाती है मॉड्यूल को बिना किसी कॉन्फ़िगरेशन के अनुप्रयोग में रखा जाना चाहिए (
CategoryTable
को पॉप्युलेट करने के लिए अधिकतम एक डीबी-क्वेरी पर)
मैं तो क्या अब तक
पहले तो मैं सिद्धांत कार्यक्षमता एकल टेबल विरासत साथ चलाने के लिए चुना है। इसने मुझे MovieEntity extends BaseEntity
जैसी चीजों को आसानी से करने की अनुमति दी और चीजें डाटाबेस में नई इकाइयों को जोड़ने के लिए आकर्षण की तरह काम करती हैं। लेकिन मुख्य समस्या बनी हुई है: यदि उपयोगकर्ता श्रेणी बदलता है, तो यह EntityClass को बदल देगा और यह बहुत अधिक नो-गो है।
मेरा मतलब है हाँ, मैं अपने वर्तमान तरीके से चीजों को कर सकता हूं और श्रेणी के परिवर्तन पर DiscriminatorColumn
मैन्युअल रूप से संशोधित कर सकता हूं लेकिन यह बहुत ही गंदा है।
एक और वैकल्पिक दृष्टिकोण यह होगा कि श्रेणी बदलने की स्थिति पर, एक नई इकाई बनाई जाएगी और पुराना व्यक्ति नष्ट हो जाएगा, लेकिन यह भी गंदा लगता है।
सब कुछ मुझे लगता है कि मैं गलत दिशा में आगे बढ़ रहा हूं। एक विकास-पैटर्न हो सकता है जिसके बारे में मुझे नहीं पता है कि मेरा सख्त काम कचरे की तरह दिखता है और चीजें अंत में सुपर आसान हो जाती हैं, लेकिन ऐसा लगता है कि मैं सामानों को देख रहा हूं।
शायद मैं क्या कर रहा हूँ के लिए साइन अप के करीब आइडिया पाने के लिए आपको GitHub पर अपने आवेदन पर एक नजर है हो सकता है:
- DuitMarketplace - यह एक आधार वर्ग के साथ मुख्य आवेदन, सभी है नियंत्रक, आदि ...
ItemController#editAction()
कुछ और संकेत प्रदान कर सकता है कि मैं कुछ चीजों को स्वचालित करने का इरादा रखता हूं। - DuitMarketplaceItemVehicle - एक वर्ग है कि के मिल mainapp में
अग्रिम धन्यवाद में सभी प्रतिक्रिया मैं मिल सकता है के लिए गिरा दिया। मुझे पूरी तरह से एहसास है कि यह प्रश्न शायद एसओ बनाम प्रोग्रामर.स्टैक एक्सचेंज पर मौजूद एक अस्तित्व के बीच सीमा रेखा है, लेकिन मैंने इसे सब कुछ के बाद यहां चुना है।
अरे समय, आपके इनपुट के लिए धन्यवाद, यह डिज़ाइन अब तक मेरे आवेदन में किए गए कार्यों की तुलना में अधिक स्पष्ट दिखता है, इसलिए इनपुट के लिए धन्यवाद। समस्या जो मैं देखता हूं (हालांकि मैं गलत हो सकता हूं) अभी भी एक श्रेणी का परिवर्तन है। क्या आपका उदाहरण स्वचालित रूप से 'एंटिटी' के अंदर' भेदभावकर्ता कॉलम 'को अपडेट करेगा जब एक अलग श्रेणी का चयन किया जाता है? मैं निश्चित रूप से इसका परीक्षण करूँगा! पीएस: कुछ मॉड्यूल से डिस्कमिनेटर मैपिंग का विस्तार करने के लिए: [उप-मॉड्यूल के मेरे ऑनबूटस्ट्रैप() देखें [https://github.com/manuakasam/DuitMarketplaceItemVehicle/blob/master/Module.php#L35-L48) – Sam
सैम, मैं नहीं करता ऐसा नहीं लगता, केवल एक 'चीज' (या 'बेसइन्टिटी') है। 'मूवीइन्टिटी' से 'बेसइन्टिटी' को अलग-अलग श्रेणियों में स्थानांतरित कर दिया गया है। हालांकि, मैं timdev के समाधान में क्या याद कर रहा हूं, यह है कि प्रति 'थिंग' श्रेणी द्वारा परिभाषित उन गुणों के मूल्यों को कैसे स्टोर किया जाए। 'ThingCategoryProperty' इकाई की आवश्यकता है जिसमें 'थिंग' और' श्रेणी' के साथ कई लोगों के लिए एक अधिग्रहण है। तरह से सैम, मैं जिस तरह से आप 'DiscriminatorMapping' के गतिशील सामग्री हल पसंद है! – netiul
@Sam - नहीं, जब आप श्रेणी बदलने के लिए, आप एक ThingSomeCategory हटा सकते हैं और कुछ अन्य ThingSomeCategory डालें। – timdev