Я попытался добавить ограничение внешнего ключа с помощью миграций. Миграция завершается без ошибок. Однако при проверке базы данных ограничение внешнего ключа не добавляется в таблицу. Другие вещи, указанные в миграциях, работают нормально, кроме ограничения FK.
Моя сводная таблица с FKs:
Schema::create('book_author', function (Blueprint $table) {
$table->integer('book_id')->unsigned();
$table->integer('author_id')->unsigned();
$table->foreign('book_id')->references('id')->on('book')->onDelete('restrict')->onUpdate('cascade');
$table->foreign('author_id')->references('id')->on('author')->onDelete('restrict')->onUpdate('cascade');
$table->primary(['book_id','author_id']);
});
Schema::enableForeignKeyConstraints();
Авторская таблица:
Schema::create('author', function (Blueprint $table) {
$table->increments('id');
$table->string('email', 250)->unique();
});
Книжный стол:
Schema::create('book', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
});
Есть что-то, что я здесь скучаю?
MyISAM не поддерживает внешний ключ: http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html
Запустите следующую команду, чтобы убедиться, какой движок имеет ваша таблица:
SHOW TABLE STATUS WHERE Name = 'book_author'
Если это показывает MyISAM
У вас есть два варианта:
Я бы выбрал вариант 2, потому что вы создаете новую таблицу и здесь нет риска потерять данные.
Вы можете форсировать свои миграции с помощью:
$table->engine = 'InnoDB';
Кроме того, вы можете запустить эту команду вручную:
ALTER TABLE book_author ENGINE=INNODB
Измени свой book_author миграция в:
Schema::create('book_author', function (Blueprint $table) {
$table->integer('book_id')->unsigned()->index();
$table->integer('author_id')->unsigned()->index();
$table->foreign('book_id')->references('id')->on('book')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('author_id')->references('id')->on('author')->onDelete('cascade')->onUpdate('cascade');
});
Это должно работать.
С другой стороны, вы нарушаете несколько соглашений Laravel с именами таблиц: