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

Я попытался добавить ограничение внешнего ключа с помощью миграции. Миграция завершается без ошибок. Однако при проверке базы данных ограничение внешнего ключа не добавляется в таблицу. Другие вещи, указанные в миграции, работают нормально, за исключением ограничения FK.

Моя сводная таблица с FK:

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');
        });

Есть ли что-то, что мне здесь не хватает?


person paarandika    schedule 20.01.2017    source источник
comment
Какая база данных? Как вы проверяете наличие внешнего ключа?   -  person user1669496    schedule 20.01.2017
comment
Добавив поле с фиктивными значениями «id» для обоих столбцов.   -  person paarandika    schedule 20.01.2017
comment
Ваш движок таблиц InnoDB или MyISAM?   -  person Felippe Duarte    schedule 20.01.2017
comment
Вы пытались внести изменения, которые я предложил в своем ответе? Если да, проблема все еще существует?   -  person Mihailo    schedule 20.01.2017
comment
Да. Тот же результат. Нет разницы. Кстати, я не проголосовал за ваш ответ.   -  person paarandika    schedule 20.01.2017
comment
@FelippeDuarte Я не менял движок по умолчанию. Поэтому я думаю, что это MyISAM.   -  person paarandika    schedule 20.01.2017
comment
MyISAM не поддерживает внешние ключи. Пожалуйста, запустите SHOW TABLE STATUS WHERE Name = 'book_author' и проверьте, какой движок у вашей таблицы.   -  person Felippe Duarte    schedule 20.01.2017
comment
Ах... Какой позор... Np спасибо за информацию, всегда странно, когда люди голосуют против, не комментируя. Я оставлю свой ответ здесь, если кто-то еще найдет его полезным.   -  person Mihailo    schedule 20.01.2017


Ответы (2)


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

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

SHOW TABLE STATUS WHERE Name = 'book_author'

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

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

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

Вы можете принудительно выполнить миграцию с помощью:

$table->engine = 'InnoDB';

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

ALTER TABLE book_author ENGINE=INNODB
person Felippe Duarte    schedule 20.01.2017

Измените миграцию 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) — алфавитный приоритет.
person Mihailo    schedule 20.01.2017