2013-04-04 19 views
25

द्वारा बनाई गई पिवट तालिका कैसे है, http://four.laravel.com/docs/eloquent#many-to-many में वर्णित कई से अधिक रिश्तों के साथ काम करते समय, मैं वास्तव में मेरे लिए पिवट टेबल बनाने के लिए लार्वेल कैसे प्राप्त कर सकता हूं?लार्वेल

क्या मुझे शामिल होने वाले दो मॉडलों के लिए अपने माइग्रेशन में कुछ जोड़ने की ज़रूरत है? क्या मुझे पिवट तालिका के लिए मैन्युअल रूप से माइग्रेशन बनाने की आवश्यकता है? या लारवेल पिवोट टेबल बनाने के लिए कैसे जानता है?

सभी मैं अब तक किया है दो-अपने मॉडल के लिए belongsToMany जानकारी जोड़ है, यानि कि

class User extends Eloquent 
{ 
    public function roles() 
    { 
     return $this->belongsToMany('Role'); 
    } 
} 

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

उत्तर

41

ऐसा प्रतीत होता है कि पिवट तालिका को मैन्युअल रूप से बनाया जाना आवश्यक है (यानी लार्वा इसे स्वचालित रूप से नहीं करता है)। यहां इसका तरीका बताया गया है:

php artisan migrate:make create_alpha_beta_table --create --table=alpha_beta 

2.) नव निर्मित प्रवास, परिवर्तन के अंदर:

1.) वर्णमाला क्रम में (डिफ़ॉल्ट) एक नया माइग्रेशन बनाएँ, विलक्षण तालिका नाम का उपयोग ऊपर कार्य:

public function up() 
{ 
    Schema::create('alpha_beta', function(Blueprint $table) 
    { 
     $table->increments('id'); 
     $table->integer('alpha_id'); 
     $table->integer('beta_id'); 
    }); 
} 

3.) वांछित अगर विदेशी कुंजी बाधाओं को जोड़ें। (मुझे अभी तक उस बिट तक नहीं मिला है)।


अब बीज के, कहते हैं, अल्फा मेज, बीटा से कुंजियों का उपयोग, आप अपने AlphaTableSeeder में निम्न कर सकते हैं: (मैं इसे संपादित करने के लिए करने की कोशिश की

public function run() 
{ 
    DB::table('alpha')->delete(); 

    Alpha::create(array( 
     'all'   => 'all', 
     'your'   => 'your', 
     'stuff'   => 'stuff', 
    ))->beta()->attach($idOfYourBeta); 
} 
+0

यदि आप 'अपरिभाषित विधि पर कॉल कर रहे हैं ..."जब आपका बीज उस {मॉडल}() -> संलग्न (/ ... विधि को चलाने की कोशिश करता है, तो उनमें से किसी एक में से संबंधित में, दोनों टैबलेट के लिए एक मॉडल बनाने के लिए याद रखें। उदाहरण के लिए, मॉडल में /Alpha.php में आप शामिल होंगे: सार्वजनिक फ़ंक्शन बीटा() { $ 2-> संबंधित ToMany ('बीटा'); } – sersun

+0

मुझे लगता है कि चरण 1 होना चाहिए: '' php artisan माइग्रेट करें: create_alpha_beta_table --create बनाएं = alpha_beta''' – Adamski

+1

लार्वेल से 5 कारीगर कमांड 'मेक: माइग्रेशन' – Jason

17

बेन जवाब पर विस्तार करने के लिए, लेकिन समीक्षाकर्ताओं ने कहा कि यह बहुत अधिक जोड़ा गया है):

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

public function up() 
{ 
    Schema::table('alpha_beta', function(Blueprint $table) 
    { 
     $table->foreign('alpha_id')->references('id')->on('alpha'); 
     $table->foreign('beta_id')->references('id')->on('beta'); 
    }); 
} 
+3

जो भी 1.5 वर्षीय उत्तर पर डाउनवॉट किया गया। अगली बार, सुधार के लिए टिप्पणी करें। – AfzalivE

+1

क्या आप एक जोड़ना चाहते हैं onDelete ('कैस्केड'); –

30

मैं उपयोग जेफरी रास्ता है Laravel-4-Generators या Laravel-5-Generators-Extended

php artisan generate:pivot table_one table_two 
+1

यह विदेशी कुंजी बाधाओं को भी बनाता है। –

+2

लार्वेल -5-जेनरेटर-विस्तारित के लिए, आदेश 'मेक: माइग्रेशन: पिवट' है और अब 'जेनरेट नहीं होता है: पिवोट' (जैसा कि यह लैरवेल -4 जेनरेटर में था)। – Jon

5

कई के लिए कई रिश्ते को आप इस तरह मैन्युअल रूप से डेटाबेस के प्रवासन फ़ाइल बना सकते हैं:

तो आप सिर्फ इस कारीगर आदेश का उपयोग कर सकते हैं

use Illuminate\Database\Migrations\Migration; 
use Illuminate\Database\Schema\Blueprint; 

class CreateAccountTagTable extends Migration 
{ 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('account_tag', function (Blueprint $table) { 
      // $table->timestamps(); // not required 
      // $table->softDeletes(); // not required 

      $table->integer('account_id')->unsigned(); 
      $table->foreign('account_id')->references('id')->on('accounts'); 

      $table->integer('tag_id')->unsigned()->nullable(); 
      $table->foreign('tag_id')->references('id')->on('tags'); 
     }); 
    } 

    /** 
    * Reverse the migrations. 
    * 
    * @return void 
    */ 
    public function down() 
    { 
     Schema::drop('account_tag'); 
    } 
} 

नोट: में यदि आपके पास पिवट तालिका पर timestamps है तो आपको withTimestamps दोनों सिरों के रिश्ते पर सेट करना होगा:

return $this->belongsToMany(\Mega\Modules\Account\Models\Tag::class)->withTimestamps(); 

return $this->belongsToMany(\Mega\Modules\Account\Models\Account::class)->withTimestamps();