Я новичок в миграции и пытаюсь создать 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'); });