2013-04-04 4 views
25

В Laravel 4, работая с отношениями «многие ко многим», как описано в http://four.laravel.com/docs/eloquent#many-to-many, как я могу заставить Laravel создать сводную таблицу для меня?Как создается сводная таблица, созданная laravel

Должен ли я добавить что-то в свои миграции для двух моделей, которые задействованы? Нужно ли вручную создавать перенос для сводной таблицы? Или как Laravel знает, чтобы создать сводную таблицу?

Все, что я сделал до сих пор добавить belongsToMany информацию в двух соответствующих моделях, т.е.

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

Однако это не вызывает создание сводной таблицы? Какой шаг я пропущу?

ответ

41

Кажется, что сводная таблица должна быть создана вручную (т. Е. Laravel не делает это автоматически). Вот как это сделать:

1.) Создайте новую миграцию, используя особые имена таблиц в алфавитном порядке (по умолчанию):

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

2.) Внутри вновь созданной миграции, изменения функция увеличения до:

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

Если вы получаете запрос на неопределенный метод ...«Когда ваше семя пытается запустить этот метод {model)() -> attach (/ ...), не забудьте создать модель для обеих таблиц, с одним из них в одной из них. Например, для этого примера: в моделях /Alpha.php, вы бы включили: public function beta() { return $ this-> принадлежит ToMany ('Beta'); } – sersun

+0

Я думаю, что шаг 1 должен быть: '' 'php artisan migrate: make create_alpha_beta_table --create = alpha_beta''' – Adamski

+1

Из Laravel 5 команда artisan 'make: migration' – 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 ('cascade'); –

30

Я использую Jeffrey Way, Laravel-4-Generators или Laravel-5-Generators-Extended.

, то вы можете просто использовать эту команду мастеровых:

php artisan generate:pivot table_one table_two 
+1

Это также создает ограничения внешнего ключа. –

+2

Для Laravel-5-Generators-Extended команда 'make: migration: pivot' и больше не генерирует: pivot' (как это было в Laravel-4-Generators). – 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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^