Миграция Laravel не добавит внешний ключ

Я новичок в миграции и пытаюсь создать 2 таблицы с внешним ключом в одном, ссылающемся на id в другом, но я получаю общий отказ от добавления ключевой ошибки. есть что-то, чего я не хватает?

ошибка:

[PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

код:

  Schema::create('app_groups', function($table) { $table->increments('id'); $table->string('app_name'); $table->unsignedInteger('app_group_id'); $table->timestamps(); }); Schema::create('app_to_bucket', function($table) { $table->increments('id'); $table->unsignedInteger('app_group_id'); $table->unsignedInteger('bucket_id'); $table->timestamps(); }); Schema::table('app_to_bucket', function($table) { $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade'); }); 

Это будет работать точно. Красноречивые первичные ключи имеют целое число с длиной 10 и без знака. Вот почему отношение не работает.

 Schema::create('app_groups', function($table) { $table->string('app_name'); $table->integer('app_group_id')->length(10)->unsigned(); $table->timestamps(); }); Schema::create('app_to_bucket', function($table) { $table->integer('app_group_id'); $table->integer('bucket_id')->length(10)->unsigned(); $table->timestamps(); }); Schema::table('app_to_bucket', function($table) { $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade'); 

Я решил проблему.

Проблема заключалась в том, что Laravel автоматически предполагает увеличение столбцов в качестве первичного ключа. поэтому мне нужно было указать, что мой app_group_id был основным ключом.

  Schema::create('app_groups', function($table) { $table->string('app_name'); $table->integer('app_group_id'); $table->primary('app_group_id'); $table->timestamps(); }); Schema::create('app_to_bucket', function($table) { $table->integer('app_group_id'); $table->integer('bucket_id'); $table->primary('bucket_id'); $table->timestamps(); }); Schema::table('app_to_bucket', function($table) { $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade'); }); 

внешний ключ и ссылочный ключ должны иметь одинаковую длину и одинаковый тип. если вы установите эти ключи, удовлетворяющие этому, ошибка не будет всплывать 🙂

Попробуй это:

 Schema::create('app_groups', function($table) { $table->increments('id'); $table->integer('group_id')->unsigned(); $table->string('app_name'); $table->timestamps(); }); Schema::create('app_to_bucket', function($table) { $table->increments('id'); $table->integer('app_group_id')->unsigned(); $table->integer('bucket_id')->unsigned(); $table->timestamps(); $table->foreign('app_group_id')->references('group_id')->on('app_groups')->onDelete('cascade'); }); 

Сначала вы должны создать таблицу, а затем создать внешние ключи:

 Schema::create('app_to_bucket', function($table) { $table->increments('id'); $table->integer('bucket_id')->unsigned(); $table->integer('app_group_id')->unsigned(); $table->timestamps(); }); Schema::table('app_to_bucket', function($table) { $table->foreign('app_group_id')->references('app_group_id')->on('app_groups')->onDelete('cascade'); });