ऊपर दिए गए उत्तर मेरे लिए यह समझने के लिए पर्याप्त नहीं थे कि क्या चल रहा है, इसलिए इसे और अधिक समझने के बाद मुझे लगता है कि मेरे पास इसे समझाने का एक तरीका है, जो उन लोगों के लिए समझ में आएगा, जिन्होंने मुझे समझने के लिए संघर्ष किया।
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 स्टेटमेंट से यह पता नहीं चलेगा कि वह श्रेणी 'टास्क' में श्रेणी की जानकारी डालने के लिए कौन सा चर बनाएगा।
आशा है कि यह इसे थोड़ा बेहतर बताता है।