सिद्धांत 2 और एक अतिरिक्त क्षेत्र के साथ कई-से-कई लिंक तालिका


88

(मेरे असंगत सवाल के लिए खेद है: मैंने कुछ सवालों के जवाब देने की कोशिश की क्योंकि मैं यह पोस्ट लिख रहा था, लेकिन यहाँ यह है :)

मैं एक लिंक तालिका के अंदर कई-से-कई संबंधों के साथ एक डेटाबेस मॉडल बनाने की कोशिश कर रहा हूं, लेकिन जिसकी प्रति लिंक भी एक मूल्य है, इस मामले में स्टॉक-कीपिंग टेबल। (यह मेरे द्वारा की जा रही अधिक समस्याओं के लिए एक मूल उदाहरण है, लेकिन मुझे लगा कि मैं इसे जारी रखने से पहले इसका परीक्षण करूंगा।)

एक बुनियादी बहु-स्टोर, बहु-उत्पाद स्टोर-कीपिंग सिस्टम के लिए डेटाबेस मॉडल

मैंने इस सरल उदाहरण के लिए दो एंटिटी स्टोर और उत्पाद बनाने के लिए Exportmwb का उपयोग किया है , दोनों नीचे प्रदर्शित किए गए हैं।

हालांकि, अब समस्या यह है कि मैं Doctrine का उपयोग करके स्टॉक का उपयोग करने के तरीके का पता नहीं लगा सकता हूं। इसके अलावा, जब मैं सिद्धांत के orm का उपयोग करके तालिकाएँ बनाने का प्रयास करता हूं: स्कीमा-उपकरण: फ़ंक्शन बनाएँ

डेटाबेस लेआउट के रूप में यह HeidiSQL से देखा जाता है

इससे केवल दो एंटिटी और तीन टेबल निकले, एक बिना वैल्यू के लिंक टेबल और दो डेटा टेबल के रूप में, क्योंकि कई-से-कई रिलेशनशिप खुद नहीं हैं, इसलिए मैं केवल एक इकाई के रूप में उत्पाद और स्टोर कर सकता हूं।

इसलिए, तार्किक रूप से, मैंने अपने डेटाबेस मॉडल को स्टॉक और स्टोर करने के लिए रिश्तों के साथ एक अलग तालिका के रूप में बदलने की कोशिश की। मैं फ़ील्डनाम को केवल उस समस्या के स्रोत के रूप में बाहर करने में सक्षम होने के लिए फिर से लिखता हूं:

डेटाबेस लेआउट बदल दिया है

फिर मुझे जो मिला वह यह था कि मुझे अभी भी स्टॉक इकाई नहीं मिली है ... और डेटाबेस के पास 'राशि' फ़ील्ड नहीं थी।

मुझे वास्तव में इन स्टोरों और उत्पादों को स्टॉक टेबल (अन्य चीजों के साथ) में एक साथ बांधने में सक्षम होने की आवश्यकता थी ... इसलिए केवल उत्पाद पर स्टॉक को जोड़ना एक विकल्प नहीं है।

root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK]   Entity\Product
[OK]   Entity\Store

और जब मैं डेटाबेस बनाता हूं, तब भी यह मुझे स्टॉक टेबल में सही फ़ील्ड नहीं देता है:

डेटाबेस लेआउट के रूप में यह HeidiSQL से देखा जाता है

इसलिए, यहां कुछ चीजों को देखते हुए, मुझे पता चला कि कई-से-कई कनेक्शन इकाइयां नहीं हैं और इस प्रकार मान नहीं हो सकते। इसलिए मैंने इसे दूसरों के साथ संबंधों के साथ एक अलग तालिका में बदलने की कोशिश की, लेकिन यह अभी भी काम नहीं किया।

मुझसे यहां क्या गलत हो रहा है?


ठीक है, मैंने कुछ उल्लेखों का उल्लेख करते हुए कहा कि इन रिश्तों को रोकने की सलाह देने वाली टिप्पणियों के साथ, डॉक्ट्रिन का उपयोग करने वाले कई-से-कई कनेक्शन होना संभव नहीं है .. लेकिन क्या होगा यदि आप वास्तव में ऐसी स्थिति से चिपके हुए हैं जैसे कि मैंने जिस में वर्णित किया है मेरा मूल प्रश्न? मेरे पास एक संपूर्ण डेटाबेस है, जो Magento के साथ संगत है, जो पूरी तरह से कई-से-कई रिश्तों पर निर्भर करता है। तो मूल रूप से मुझे कहा जा रहा है "डॉक्ट्रिन ओआरएम कई-कई को संभाल नहीं सकता है, इसका उपयोग न करें" ??
हेनरी वैन मेगन


3
अगर आप इस तरह के एक अच्छे तरीके के बारे में मैं सोच रहा था कि क्या समझाने के लिए किए गए प्रयास के लिए मैं आपको 100 + दे सकता हूं, तो :-)
टॉर्स्टन रोमर

जवाबों:


141

अतिरिक्त मूल्यों के साथ कई-से-कई एसोसिएशन एक बहुत-से-कई नहीं है, लेकिन वास्तव में एक नई इकाई है, क्योंकि अब इसमें एक पहचानकर्ता (जुड़े संस्थाओं से दो संबंध) और मूल्य हैं।

यही कारण है कि यह भी कारण नहीं है क्यों कई-से-अनेक संघों इतना दुर्लभ हैं: आप इस तरह के रूप में उन्हें अतिरिक्त गुण, स्टोर करने के लिए करते हैं sorting, amountआदि

आपको निम्नलिखित में से कुछ की आवश्यकता है (मैंने दोनों संबंधों को अप्रत्यक्ष बना दिया, कम से कम एक यूनी-दिशात्मक बनाने पर विचार करें):

उत्पाद:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="product") @ORM\Entity() */
class Product
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */
    protected $stockProducts;
}

दुकान:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="store") @ORM\Entity() */
class Store
{
    /** @ORM\Id() @ORM\Column(type="integer") */
    protected $id;

    /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */
    protected $name;

    /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */
    protected $stockProducts;
}

भण्डार:

namespace Entity;

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Table(name="stock") @ORM\Entity() */
class Stock
{
    /** ORM\Column(type="integer") */
    protected $amount;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) 
     */
    protected $store;

    /** 
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") 
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) 
     */
    protected $product;
}

ठीक है, मैं कुछ गेट्टर और सेटर जोड़ूंगा, क्योंकि इस सेटअप के साथ, मुझे केवल प्राथमिक कुंजियाँ मिलती हैं और बिना किसी मान के चलती हैं :)
हेनरी वैन मेगन

जब मैं इस सेटअप का उपयोग करता हूं और तब Stock.store_id का उपयोग करके क्वेरी करने का प्रयास करता हूं, तो मुझे त्रुटि मिलती है "स्टॉक में कोई फ़ील्ड या एसोसिएशन नहीं है जिसका नाम store_id" है। यह पाया जाना चाहिए क्योंकि स्तंभ डेटाबेस में मौजूद है।
afilina

स्कीमा उत्पन्न करते समय @afilina db कोई मायने नहीं रखता है - DBAL अपवाद को फेंक देता है क्योंकि यह DDL मेटाडेटा (मेमोरी में) में कॉलम नहीं
खोजता है

@Ocramius मेरा मतलब क्या था कि DB मेटाडेटा से उत्पन्न हुआ था। SIf यह कॉलम को पहले स्थान पर उत्पन्न करने में सक्षम था, फिर इसे क्वेरी के दौरान खोजने में सक्षम होना चाहिए। मेरी समस्या का समाधान स्टॉक.स्टोर को वांछित आईडी से तुलना करना था।
afilina

100% मुझे क्या चाहिए और यह एक आकर्षण की तरह काम करता है! क्या आप जानते हैं कि प्रति स्टोर और उत्पाद की राशि को संपादित करने के लिए फ़ील्डसेट के साथ एक फॉर्म कैसे बनाया जाए?
cwhisperer

17

सिद्धांत बहुत से रिश्तों को ठीक करता है।

समस्या यह है कि आप एक साधारण ManyToMany एसोसिएशन की आवश्यकता नहीं है, क्योंकि संघों में "अतिरिक्त" डेटा नहीं हो सकता है।

आपकी मध्य (स्टॉक) तालिका, क्योंकि इसमें product_id और store_id से अधिक है, उस अतिरिक्त डेटा को मॉडल करने के लिए अपनी स्वयं की इकाई की आवश्यकता है।

तो आप वास्तव में इकाई के तीन वर्ग चाहते हैं:

  • उत्पाद
  • शेयर के स्तर
  • दुकान

और दो संघ:

  • उत्पाद oneToMany StockLevel
  • OneToMany StockLevel स्टोर करें

1
आपके उत्तर के लिए धन्यवाद ! मैंने टेबल की तरह अपने "स्टॉक" में अतिरिक्त फ़ील्ड जोड़े। हालांकि, सिद्धांत अभी भी इस "ज्वाइन टेबल" पर विचार नहीं करते हैं और इसे तब छोड़ते हैं जब मैं php app/console doctrine:mapping:import AppBundle ymlडेटाबेस से स्कीमा आयात करने के लिए चलाता हूं । मैं चाहूंगा कि इस अतिरिक्त मैपिंग यम फ़ाइल को जनरेट करें। क्या किसी को कोई ख़याल है ? :(
स्टेफेन

उत्तर लेखन डेटा को "कनेक्शन" इकाई में हल नहीं करना। यह एक समस्या है। संस्थाओं की घोषणा नहीं। क्या कोई व्यक्ति उदाहरण का समर्थन कर सकता है, जहाँ फॉर्म से डेटा पास किया गया है (कलेक्शन टाइप फील्ड में एंटिटी टाइप फील्ड के साथ एंबेडेड फॉर्म है)। मैं
एंबेडेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.