2016-03-24 15 views
21

मुझे उत्सुकता है कि hasMany के लिए वाक्प्रचार संबंध belongsToMany के मुकाबले एक अलग हस्ताक्षर है। विशेष रूप से कस्टम शामिल तालिका नाम - एक सिस्टम के लिए जहां Comment कई Role एस से संबंधित है, और दिए गए Role में कई Comment एस होंगे, मैं my_custom_join_table नामक तालिका में रिश्ते को स्टोर करना चाहता हूं और comment_key के रूप में सेट की गई कुंजी है और role_keyमें कई बनाम हैं laravel 5.x

return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works 

लेकिन उलटा पर, मुझे लगता है कि कस्टम तालिका (कम से कम डॉक्स यह उल्लेख नहीं है) को परिभाषित नहीं कर सकते हैं:

return $this->hasMany('App\Comment', 'comment_key', 'role_key'); 

अगर मैं एक Role वस्तु है कि hasManyComments, लेकिन मैं उस रिश्ते को स्टोर करने के लिए एक गैर-मानक तालिका नाम का उपयोग करता हूं, मैं इस गैर मानक तालिका का उपयोग क्यों कर सकता हूं, लेकिन दूसरा नहीं?

+0

एक द्वि-दिशात्मक का प्रतिलोम कई-से-अनेक संबंध में कई-से-अनेक है, नहीं एक-से-कई। सिद्धांत में सभी संबंध आदेशों की एक अच्छी प्रस्तुति है [http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional) और उनके कार्यान्वयन। – bishop

+0

आधिकारिक दस्तावेज में भी वांछित संबंधों के बारे में बहुत अच्छा लेखन है https://laravel.com/docs/5.2/eloquent-relationships – user3158900

उत्तर

64

hasManyOne To Many संबंध में उपयोग किया जाता है जबकि belongsToManyMany To Many संबंधों को संदर्भित करता है। वे दोनों अलग-अलग संबंध प्रकार हैं और प्रत्येक को एक अलग डेटाबेस संरचना की आवश्यकता होती है - इस प्रकार वे विभिन्न मानकों को लेते हैं।

मुख्य अंतर यह है कि एक से कई रिश्तों में, आपको केवल संबंधित डेटाबेस से संबंधित दो डेटाबेस टेबल की आवश्यकता होती है। ऐसा इसलिए है क्योंकि संबंध का संदर्भ स्वामित्व वाले मॉडल की तालिका पर संग्रहीत है। उदाहरण के लिए, आपके पास Country मॉडल और City मॉडल हो सकता है। एक देश में कई शहर हैं। हालांकि, प्रत्येक शहर केवल एक देश में मौजूद है। इसलिए, आप उस शहर को शहर मॉडल पर ही (country_id या उसके जैसा कुछ) स्टोर करेंगे।

हालांकि, कई रिश्ते के लिए एक कई एक तीसरे डेटाबेस तालिका की आवश्यकता है, एक पाइवट टेबल कहा जाता है। पिवोट टेबल दोनों मॉडलों के संदर्भों को संग्रहीत करता है और आप रिलेशनशिप घोषणा में इसे दूसरे पैरामीटर के रूप में घोषित कर सकते हैं। उदाहरण के लिए, कल्पना करें कि आपके पास City मॉडल है और आपके पास Car मॉडल भी है। आप एक रिश्ते को हर शहर में चलने वाली कारों के प्रकार दिखाने के लिए चाहते हैं। खैर, एक शहर में लोग ड्राइव विभिन्न प्रकार की कार ड्राइव करेंगे। हालांकि, अगर आप एक कार प्रकार को देखते हैं तो आपको यह भी पता चलेगा कि इसे में विभिन्न शहरों में संचालित किया जा सकता है। इसलिए किसी भी मॉडल पर city_id या car_id स्टोर करना असंभव होगा क्योंकि प्रत्येक में एक से अधिक होगा। इसलिए, आप उन संदर्भों को पिवट तालिका में डालते हैं।

अंगूठे का एक नियम के रूप में, यदि आप एक belongsToMany संबंध उपयोग करें, यह केवल एक और belongsToMany संबंध के साथ रखा कर सकते हैं और इसका मतलब है आप किसी तृतीय पिवट तालिका है। यदि आप hasMany रिलेशनशिप का उपयोग करते हैं, तो यह केवल को belongsTo रिश्ते के साथ जोड़ा जा सकता है और कोई अतिरिक्त डेटाबेस टेबल आवश्यक नहीं है।

आपके उदाहरण में, आपको केवल belongsToMany में व्यस्त संबंध बनाने की आवश्यकता है और विदेशी और स्थानीय कुंजी (अन्य मॉडल से ऑर्डर को उलटकर) के साथ फिर से अपनी कस्टम तालिका जोड़ें।

+1

सरल, पूर्ण, कुशल –

+0

बहुत साफ और उपयोगी स्पष्टीकरण! – Andy

+0

बिल्कुल सही स्पष्टीकरण –

13

टेक्स्ट और एक आकृति के साथ समझने की कोशिश करें।

  1. एक (hasOne) रिश्ते के लिए एक:

    • एक उपयोगकर्ता है (हो सकता है) एक प्रोफ़ाइल। तो, एक प्रोफ़ाइल एक उपयोगकर्ता से संबंधित है।
  2. एक कई (hasMany) करने के लिए:

    • एक उपयोगकर्ता कई (कई हो सकते हैं) लेख है। तो, कई लेख एक उपयोगकर्ता के हैं।
  3. कई कई (BelongsToMany) करने के लिए:

    • एक उपयोगकर्ता कई मंचों की हो सकती है। तो, एक मंच कई उपयोगकर्ताओं से संबंधित है।

    RelationShip

+0

हैसऑन/संबंधित के मामले में, मुझे लगता है कि हैऑन निर्देशित करता है कि कौन सी तालिका संबंधित तालिका के संदर्भ में रखेगी (उपयोगकर्ता तालिका में इस मामले में प्रोफाइल_आईडी है)? – Lunfel

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