Миграция Laravel — внешний ключ не применяется к таблице

Я попытался добавить ограничение внешнего ключа с помощью миграций. Миграция завершается без ошибок. Однако при проверке базы данных ограничение внешнего ключа не добавляется в таблицу. Другие вещи, указанные в миграциях, работают нормально, кроме ограничения 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');
});

Есть что-то, что я здесь скучаю?

0

Решение

MyISAM не поддерживает внешний ключ: http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

Запустите следующую команду, чтобы убедиться, какой движок имеет ваша таблица:

SHOW TABLE STATUS WHERE Name = 'book_author'

Если это показывает MyISAMУ вас есть два варианта:

  1. не используйте FK вообще
  2. Замени свой двигатель

Я бы выбрал вариант 2, потому что вы создаете новую таблицу и здесь нет риска потерять данные.

Вы можете форсировать свои миграции с помощью:

$table->engine = 'InnoDB';

Кроме того, вы можете запустить эту команду вручную:

ALTER TABLE book_author ENGINE=INNODB
0

Другие решения

Измени свой 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 с именами таблиц:

  1. Назовите свои таблицы во множественном числе (авторы & книги)
  2. Сводная таблица (book_author) должен называться (author_book) — алфавитный приоритет.
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector