2012-11-24 30 views
13

मुझे पता है कि आप तालिका संबंधों को $this->belongs_to(), $this->has_many() आदि के साथ काफी आसानी से परिभाषित कर सकते हैं, लेकिन मुझे समझ में नहीं आता कि संबंध तालिका कैसे बनाई जाती है; तालिका जो दो तालिकाओं को एक साथ बांधती है (मैं भूल गया कि शब्द क्या कहा जाता है)।माइग्रेशन में लार्वा संबंध?

मान लें कि मैं एक उपयोगकर्ता तालिका बना रहा हूं। मैं चाहता हूं कि वह उपयोगकर्ता एक निश्चित "भूमिका" से संबंधित हो। कई भूमिकाएं हैं, और प्रत्येक भूमिका में एकाधिक उपयोगकर्ता हो सकते हैं। इसके लिए मुझे roles तालिका भी बनाना होगा। अब तक सब ठीक है.

लेकिन प्रलेखन पढ़ने के बाद, यह कहता है कि मुझे मॉडल में $this->belongs_to() जोड़ना चाहिए, माइग्रेशन स्वयं नहीं। कब, और रिलेशनशिप टेबल कैसे बनाई जाती है? अगर मैं roles और users टेबल बना देता हूं, और मॉडल पर $this->belongs_to('roles') और $this->has_many('users')roles मॉडल में जोड़ें, तो मध्यम तालिका स्वचालित रूप से बनाई जाएगी?

+0

"मैं भूल गया कि शब्द क्या कहा जाता है" के संबंध में, इन तालिकाओं को आमतौर पर पिवोट टेबल्स, इंटरमीडिएट टेबल्स या लुकअप टेबल्स कहा जाता है, जिनके आधार पर आप डीबी पृष्ठभूमि से हैं। –

उत्तर

0

जहाँ तक मुझे पता है, कोई रिलेशनशिप टेबल नहीं बनाया जाएगा। आपको अपनी users तालिका पर role_id की आवश्यकता होगी, ताकि जब आप कोई उपयोगकर्ता बनाते हैं, तो भूमिका की आईडी वहां संग्रहित की जाएगी। यह आपको उन सभी उपयोगकर्ताओं का चयन करने में सक्षम करेगा जहां role_id == '1' या जो भी हो सकता है। उदाहरण के लिए:

$admins = User::where('role_id', '=', 1); 

कहाँ ROLES मेज पर ID='1' साथ रिकॉर्ड व्यवस्थापक है। तो फिर से अपने प्रश्न का उत्तर देने के लिए, कोई रिलेशनशिप टेबल नहीं बनाया गया है, इसके बजाय संबंध प्रत्येक उपयोगकर्ता के लिए role_id कॉलम के रूप में आपकी दो तालिकाओं के भीतर मौजूद है। ब्याज से बाहर, क्या आप विदेशी कुंजी का उपयोग कर रहे हैं?

आप एक रिश्ते तालिका आप बना सकते हैं एक user_roles या कुछ और कहा जाता है और role_id और वहाँ में user_id स्टोर करने के लिए चाहते हैं, लेकिन मैं तो जैसा कि ऊपर विधि का उपयोग करने के लिए आप सभी Laravel/सुवक्ता अच्छाई का उपयोग कर सकते है अपने आसान लगता है ।

आशा इस मदद करता है :)

+1

उत्तर देने के लिए धन्यवाद! मुझे पता चला कि अगर मैं प्रति उपयोगकर्ता केवल एक भूमिका संग्रहित करता हूं तो कोई रिलेशनशिप टेबल की आवश्यकता नहीं होती है। लेकिन क्या होगा यदि हर उपयोगकर्ता के पास असीमित भूमिका हो सकती है? तो मेरे पास इसे किसी अन्य टेबल में स्टोर करने की तुलना में कोई अन्य विकल्प नहीं है, है ना? यह कैसे काम करेगा? मुझे पता है कि लैरावेल स्वचालित रूप से आपके लिए इन तालिकाओं को बना और प्रबंधित कर सकता है, लेकिन मैं नहीं जानता कि यह कैसे, कहां या कब करता है। – qwerty

+0

तो कौन सा बेहतर है, माइग्रेशन फ़ाइलों को बदलकर या मॉडल फ़ाइलों में रिश्तों को परिभाषित करके डेटाबेस पर संबंध बनाने के लिए क्या है? या दोनों तकनीकों का उपयोग –

30

माइग्रेशन बनाने जब आप अपने टेबल पर विदेशी कुंजी निर्दिष्ट कर सकते हैं अर्थात

public function up() 
{ 
    Schema::table('roles', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('user_id')->unsigned(); 
     //rest of fields then... 
     $table->foreign('user_id')->references('id')->on('users'); 
    }); 
} 

यह भूमिकाओं मेज पर user_id स्तंभ पर एक विदेशी कुंजी का निर्माण करेगा। विदेशी चाबियों का लाभ यह है कि जब एक अद्यतन करने या हटाने के किया जाता है विदेशी कुंजी तालिका स्वचालित रूप से अद्यतन किया जाएगा या कि "सोपानी" महान वर्णन पाया here

Laravel प्रलेखन पर वर्णित के रूप में आप भी उपयोग कर अद्यतन पर अपने व्यापक निर्दिष्ट कर सकते हैं निम्न सिंटैक्स

$table->foreign('user_id') 
    ->references('id')->on('users') 
    ->onDelete('cascade'); 

मैं समझाने के लिए यह प्रलेखन की तुलना में बेहतर है तो कृपया एक कैसे अपनी किया देखने के लिए सुवक्ता ORM दस्तावेज की "Relationships" अनुभाग पढ़ते है की कोशिश कर के एक बुरा काम करना होगा।

+0

@Roark आपको शायद यह उल्लेख करना चाहिए था कि कॉलम "user_id" पहले बनाया जाना चाहिए .. अन्यथा आपको एक त्रुटि मिल जाएगी: '' ' [रोशनी \ डेटाबेस \ क्वेरी अपवाद] SQLSTATE [42703] : अपरिभाषित कॉलम: 7 त्रुटि: विदेशी कुंजी बाधा में संदर्भित कॉलम "lang_id" मौजूद नहीं है (SQL: तालिका "op_cities" बदलें बाधा जोड़ें "op_cities_lang_i d_foreign" विदेशी कुंजी ("lang_id") संदर्भ "translator_languages" ("id")) '' – abbood

+0

यहां इसका उदाहरण: https://www.easylaravelbook.com/blog/adding-foreign-key-references-using-a-laravel- माइग्रेशन/ – abbood

+1

@abbood अधिक विस्तृत माइग्रेशन उदाहरण दिखाने के लिए अपडेट किया गया उत्तर – Roark

10

ऐसा लगता है कि प्रारंभिक सवालों के कुछ ही तरह, यानी "जब, और कैसे संबंध बनाया तालिका है" जवाब कभी नहीं थे & "मध्यम तालिका स्वचालित रूप से बनाया जाएगा":

जहां तक ​​मेरा जानकारी , इन तालिकाओं को मैन्युअल रूप से बनाया जाना चाहिए।तो इसलिए की तरह माइग्रेशन फ़ाइल बनाने:

php artisan migrate:make create_role_user_table 

ध्यान दें कि नाम विलक्षण हैं, और वर्णमाला के क्रम में प्रस्तुत कर रहे हैं।

तब की तरह पलायन कुछ में:

public function up() 
{ 
    Schema::create('role_user', function($table) { 
     $table->increments('id'); 
     $table->integer('role_id'); 
     $table->integer('user_id'); 
     $table->timestamps(); 
    }); 
} 

आशा है कि मदद करता है। मुझे यकीन नहीं है कि पिवोट टेबल्स में टाइमस्टैम्प की आवश्यकता है या नहीं, तो कृपया प्रयोग करें।

+1

'माइग्रेट: मेक' लार्वेल 5.4 के लिए कारीगर में नहीं है, यह 'php artisan make: माइग्रेशन' है –

7

हालांकि यह एक पुरानी पोस्ट है, हालांकि मैं कुछ अद्यतन कर सकता हूं। Laravel5 के लिए, जेफरी रास्ता एक पैकेज विकसित की है Laravel5 Generators-extended जो

  • make:migration:schema
  • make:migration:pivot
  • make:seed

के लिए php artisan का जनरेटर क्षमता में वृद्धि के लिए कई-से-अनेक संबंध उपयोगकर्ताओं और भूमिका के बीच, आप केवल

का उपयोग कर सकते हैं
php artisan make:migration:pivot users role 

और यह आवश्यक माइग्रेशन क्लास उत्पन्न करेगा। इसके लिए आपको मैन्युअल रूप से कोड करने की आवश्यकता नहीं है।

0

इस वीडियो ने मेरी मदद की।

https://laracasts.com/series/laravel-5-fundamentals/episodes/14

क्या मेरे लिए आश्चर्य की बात है कि रिश्ते की केवल एक तरफ, प्रवास तालिका में pointer_id की जरूरत है दोनों नहीं था। उदाहरण के लिए, यदि हमारे पास कई लेखों के साथ लेखक हैं, तो हम केवल

$table->integer('author_id') 

आलेख माइग्रेशन में जोड़ते हैं और ऐसा करते हैं।

0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन जैसा कि मेरे मन में एक ही सवाल था।

return $this -> belongsToMany('App\<Model>', '<table_created_manually>'); 

या: मैं Laravel manual (5.0) जहां यह वर्णन किया गया है कि इस विशेष कई-से-अनेक संबंध आप मैन्युअल रूप से तालिका बनाने और उसके बाद इस तरह से मॉडल में संबंध के प्रकार घोषणा कर सकते हैं के लिए में समाधान मिल गया है यदि आप विशिष्ट संबंधित कुंजी का उपयोग करना चाहते हैं:

return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id'); 

आशा है कि इससे मदद मिल सकती है।