2015-01-01 3 views
0

Я знаю, что многие люди задавали один и тот же вопрос много раз, но кажется, что я не могу заставить одни и те же решения работать для меня.Добавить ограничения внешнего ключа в миграции Laravel

Я не в состоянии установить внешний ключ для связанных таблиц, для которых up() было дано ниже:

//Migrate 1 Starts 
public function up() 
{ 
    Schema::create("UserTable", function($table){ 
     $table->tinyInteger("ApplicationID"); 
     $table->bigInteger("UserID"); 
     $table->string("UserName")->unique(); 
     $table->timestamps(); 
    }); 
} 
//Migrate 1 Ends 

//Migrate 2 Starts 
public function up() 
{ 
    Schema::create("Membership", function($table){ 
     $table->tinyInteger("ApplicationID"); 
     $table->bigInteger("UserID"); 
     $table->string("Password"); 
    } 
} 
//Migrate 2 Ends 

//Migrate 3 Starts: This has the latest timestamp, so it runs after all tables are created 
public function up() 
{ 
    Schema::table('UserTable', function($table) { 
     $table->primary("UserID"); 
     $table->foreign("UserID")->references("UserID")->on("Membership"); 
    }); 

    Schema::table('Membership', function($table) { 
     $table->primary("UserID"); 
     $table->foreign("UserID")->references("UserID")->on("UserTable"); 
    }); 
} 
//Migrate 3 Ends 

Погрешности я получаю SQLSTATE[HY000]: General rror: 1215 Cannot add foreign key constraint (SQL: alter table 'Membership' add constraint membership_userid_foreign foreign key ('UserID') references 'UserTable' ('UserID'))

ответ

0

Проблемы, что я садился до первичного ключа во время настройки внешнего ключа. Это вызывало проблемы.

Поэтому при создании таблиц необходимо создать первичные столбцы, а внешние ключи должны быть добавлены после создания всех связанных таблиц.

Я думаю, что лучше создать файл миграции create_associations после создания всех таблиц, чтобы эта миграция имела самую последнюю временную метку, и к моменту запуска этого файла все таблицы присутствуют в базе данных.

+0

Или любой столбец, который вы хотите сделать как внешний ключ, должен быть индексом и без знака. Итак, попробуйте это. –

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