उलटबयानी और मैपेडबी के बीच क्या अंतर है?


102

मैं Zend फ्रेमवर्क 2 और डॉक्ट्रिन 2 का उपयोग करके अपना एप्लिकेशन विकसित कर रहा हूं।

एनोटेशन लिखते समय, मैं mappedByऔर के बीच के अंतर को समझने में असमर्थ हूं inversedBy

मुझे कब उपयोग करना चाहिए mappedBy?

मुझे कब उपयोग करना चाहिए inversedBy?

मुझे न तो कब उपयोग करना चाहिए?

यहाँ एक उदाहरण है:

 /**
 *
 * @ORM\OneToOne(targetEntity="\custMod\Entity\Person", mappedBy="customer")
 * @ORM\JoinColumn(name="personID", referencedColumnName="id")
 */
protected $person;

/**
 *
 * @ORM\OneToOne(targetEntity="\Auth\Entity\User")
 * @ORM\JoinColumn(name="userID", referencedColumnName="id")
 */
protected $user;

/**
 *
 * @ORM\ManyToOne (targetEntity="\custMod\Entity\Company", inversedBy="customer")
 * @ORM\JoinColumn (name="companyID", referencedColumnName="id")
 */
protected $company;

मैंने त्वरित खोज की और निम्नलिखित पाया, लेकिन मैं अभी भी भ्रमित हूं:

जवाबों:


159
  • mappedBy को एक (द्विदिश) एसोसिएशन के उलटे तरफ निर्दिष्ट किया जाना है
  • inversedBy को एक (द्विदिश) एसोसिएशन के स्वयं के पक्ष में निर्दिष्ट किया जाना है

सिद्धांत प्रलेखन से:

  • ManyToOne हमेशा एक द्विदिश वर्गीकरण का स्वामी होता है।
  • OneToMany हमेशा एक द्विदिश वर्गीकरण का विलोम पक्ष है।
  • OneToOne की सहायता का मुख्य भाग विदेशी कुंजी वाली तालिका के साथ इकाई है।

Https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/unitofwork-associations.html देखें


1
अजीब तरह से डॉक्ट्रिन डॉक्यूमेंटर ने कई-एक-एक द्वि-दिशात्मक मैपिंग के याम्ल उदाहरण को छोड़ने का फैसला किया, शायद सबसे अधिक इस्तेमाल किया जाने वाला!
पीटर वोस्टर

4
@PeterWooster, एनोटेशन का उपयोग करने के लिए सबसे अच्छा अभ्यास है, क्योंकि आपको एक ही स्थान पर इकाई के बारे में सभी जानकारी है!
एंड्रियास लिंडेन

यह भी कई संबंधों के लिए कई करने के लिए aplies। उन लोगों के लिए: आप स्वयं कई-से-कई एसोसिएशन के मालिक पक्ष को चुन सकते हैं।
11mb

5
@AndreasLinden व्यापक रूप से सबसे अच्छा अभ्यास का मतलब नहीं है। मक्खी पर कोड लिखने के लिए टिप्पणियों का उपयोग करने वाली किसी चीज़ को कभी भी सबसे अच्छा अभ्यास नहीं माना जा सकता है, यह php देशी नहीं है, और यहां तक ​​कि सभी रूपरेखाओं में डिफ़ॉल्ट रूप से शामिल नहीं है। एक जगह में एक इकाई के बारे में सभी जानकारी होना एक विरोधी तर्क है। कब से अपने सभी कोड को एक ही स्थान पर समूहित करना एक अच्छी बात है? यह लिखने के लिए एक दर्द है, आपकी परियोजना में संगठन को बनाए रखने और कम करने के लिए एक दर्द है। सर्वश्रेष्ठ प्रणालियां ? ओह।
यीशुTheHun

4
@JesusTheHun आप सेब और नाशपाती की तुलना कर रहे हैं। "सभी कोड" "एक इकाई के बारे में सभी जानकारी" के लिए बहुत अलग है;)
एंड्रियास लिंडेन

55

ऊपर दिए गए उत्तर मेरे लिए यह समझने के लिए पर्याप्त नहीं थे कि क्या चल रहा है, इसलिए इसे और अधिक समझने के बाद मुझे लगता है कि मेरे पास इसे समझाने का एक तरीका है, जो उन लोगों के लिए समझ में आएगा, जिन्होंने मुझे समझने के लिए संघर्ष किया।

inversedBy और mappedBy का उपयोग आंतरिक DOCTRINE इंजन द्वारा SQL प्रश्नों की संख्या को कम करने के लिए किया जाता है, जो आपको आवश्यक जानकारी प्राप्त करने के लिए करना पड़ता है। यह स्पष्ट करने के लिए कि यदि आप उलटा नहीं डालते हैं या मैप किया गया है तो आपका कोड अभी भी काम करेगा लेकिन अनुकूलित नहीं किया जाएगा ।

उदाहरण के लिए, नीचे दी गई कक्षाओं को देखें:

class Task
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="task", type="string", length=255)
     */
    private $task;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dueDate", type="datetime")
     */
    private $dueDate;

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="tasks", cascade={"persist"})
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $category;
}

class Category
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Task", mappedBy="category")
     */
    protected $tasks;
}

ये वर्ग यदि आपको स्कीमा बनाने के लिए कमांड चलाने के लिए थे (उदाहरण के लिए bin/console doctrine:schema:update --force --dump-sql) , तो आप देखेंगे कि श्रेणी तालिका में कार्यों के लिए उस पर एक कॉलम नहीं है। (इसका कारण यह है कि इस पर कॉलम एनोटेशन नहीं है)

यहाँ समझने वाली महत्वपूर्ण बात यह है कि परिवर्तनशील कार्य केवल इतना है कि आंतरिक सिद्धांत इंजन इसके ऊपर के संदर्भ का उपयोग कर सकता है जो इसके मैपेड श्रेणी को कहते हैं। अब ... मैं यहाँ उलझन में नहीं था ... श्रेणी वर्ग नाम का उल्लेख नहीं है , टास्क वर्ग पर संपत्ति का जिक्र है जिसे 'संरक्षित $ श्रेणी' कहा जाता है।

बुद्धिमानों की तरह, टास्क क्लास में संपत्ति की $ श्रेणी का उल्लेख किया जाता है, यह उलटा है "= कार्य", ध्यान दें कि यह बहुवचन है, यह वर्ग नाम का स्थान नहीं है , लेकिन सिर्फ इसलिए कि संपत्ति को श्रेणी में 'संरक्षित $ कार्यों' कहा जाता है। कक्षा।

एक बार जब आप इसे समझ जाते हैं, तो यह समझना बहुत आसान हो जाता है कि उलटा क्या है और मैप किया हुआ है और इस स्थिति में उनका उपयोग कैसे करें।

वह पक्ष जो मेरे उदाहरण में 'कार्य' जैसी विदेशी कुंजी को संदर्भित कर रहा है, हमेशा उलटा विशेषता प्राप्त करता है क्योंकि यह जानना आवश्यक है कि उस वर्ग पर (targetEntity कमांड के माध्यम से) और उस वर्ग पर किस चर (उलटबांसी =) को 'आगे की ओर' कार्य करने के लिए बोलें और श्रेणी की जानकारी प्राप्त करें। इसे याद रखने का एक आसान तरीका, वह वर्ग है जिसके पास विदेशी_है। वह है जिसे उलटना पड़ता है।

जहां श्रेणी के साथ, और इसकी $ कार्यों की संपत्ति (जो मेज पर याद नहीं है, अनुकूलन प्रयोजनों के लिए सिर्फ कक्षा का हिस्सा है) मैप्डबी 'कार्य' है, यह आधिकारिक रूप से दो संस्थाओं के बीच संबंध बनाता है ताकि सिद्धांत अब सुरक्षित रूप से सुरक्षित रह सकें दो अलग-अलग सेलेक्ट स्टेटमेंट के बजाय जॉइन एसक्यूएल स्टेटमेंट का उपयोग करें। मैप किए बिना, सिद्धांत इंजन को JOIN स्टेटमेंट से यह पता नहीं चलेगा कि वह श्रेणी 'टास्क' में श्रेणी की जानकारी डालने के लिए कौन सा चर बनाएगा।

आशा है कि यह इसे थोड़ा बेहतर बताता है।


6
यह बहुत अच्छी तरह से समझाया गया है और आपके प्रयास के लिए धन्यवाद। मैं लारवेल एलोकेंट से सिद्धांत के लिए आया था और मेरे लिए यहां तर्क को समझना कठिन था। बहुत बढ़िया। Category is NOT referring TO THE CLASS NAME, its referring to the property on the Task class called 'protected $category'सब मुझे चाहिए। इसने न केवल मेरी समस्या को हल किया बल्कि इससे मुझे समझने में मदद मिली। सबसे अच्छा जवाब IMO :-)
अल्फा

1
मैं भी एलोकेंट से आया, इससे मुझे बहुत मदद मिली। मेरा एकमात्र स्टिकिंग पॉइंट अब यह है कि इसके लिए सेटर / गेट्टर को कैसे सेट किया जाए, मैं अभी भी इस पर रस्सियाँ सीख रहा हूँ
एमैन

1
हाँ, यह वास्तव में आसान है और यहां तक ​​कि कुछ उपकरणों के साथ स्वचालित है, बाद में मेरे साथ एक चैट शुरू करें और मैं आपकी मदद कर सकता हूं
जोसेफ एस्ट्राहन


1
symfony.com/doc/current/doctrine/associations.html , यह वास्तव में सीखने के लिए बेहतर है, सिम्फनी सिद्धांत का उपयोग करता है इसलिए यह आपको वही सिखाएगा।
जोसेफ एस्ट्राहन

21

द्विदिश संबंध में एक पक्ष और एक विलोम पक्ष होता है

mappedBy : एक द्विदिश संबंध के व्युत्क्रम पक्ष में डाल अपने स्वयं के पक्ष को संदर्भित करने के लिए

inversedBy : एक द्विदिश संबंध के मालिक पक्ष में रखने के लिए इसके उलटे पक्ष का संदर्भ लें

तथा

मैप किए गए विशेषता का उपयोग OneToOne, OneToMany या ManyToMany मैपिंग घोषणा के साथ किया जाता है।

inversedBy विशेषता OneToOne, ManyToOne, या ManyToMany मानचित्रण घोषणा के साथ इस्तेमाल किया।

सूचना : एक द्विदिश संबंध का मालिक पक्ष वह पक्ष जिसमें विदेशी कुंजी शामिल है।

डॉक्ट्रिन डॉक्यूमेंटेशन में इन्वर्टेडबी और मैप्डबी के बारे में दो संदर्भ हैं: पहला लिंक , दूसरा लिंक


1
लिंक मर चुके हैं?
Scaramouche

2

5.9.1। मालिक और उलटा पक्ष

कई-से-कई संघों के लिए आप चुन सकते हैं कि कौन सी इकाई का मालिक है और कौन-सा उलटा पक्ष है। डेवलपर्स के दृष्टिकोण से मालिक पक्ष होने के लिए कौन सा पक्ष अधिक उपयुक्त है, यह तय करने के लिए एक बहुत ही सरल अर्थ नियम है। आपको केवल अपने आप से पूछना है कि कनेक्शन प्रबंधन के लिए कौन सी संस्था जिम्मेदार है और इसे स्वयं के पक्ष के रूप में चुनें।

दो संस्थाओं का एक उदाहरण लें अनुच्छेद और टैग। जब भी आप एक अनुच्छेद को एक टैग से जोड़ना चाहते हैं और इसके विपरीत, यह ज्यादातर लेख है जो इस संबंध के लिए जिम्मेदार है। जब भी आप एक नया लेख जोड़ते हैं, तो आप इसे मौजूदा या नए टैग से जोड़ना चाहते हैं। आपका बना हुआ आलेख फ़ॉर्म संभवतः इस धारणा का समर्थन करेगा और सीधे टैग निर्दिष्ट करने की अनुमति देगा। यही कारण है कि आपको अनुच्छेद को पक्ष के रूप में चुनना चाहिए, क्योंकि यह कोड को अधिक समझने योग्य बनाता है:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.