Как использовать внешний ключ в миграции laravel 5.1
Мне нужно использовать внешний ключ для моей базы данных, но я не могу этого сделать, после запуска команды миграции в командной строке, я получаю эту ошибку:
[Illuminate\Database\QueryException] SQLSTATE [HY000]: Общая ошибка: 1215 Невозможно добавить ограничение внешнего ключа (SQL: изменить таблицу samples
добавить ограничение s amples_supplier_id_foreign внешний ключ (supplier_id
) ссылки suppliers
(id
))
[PDOException] SQLSTATE [HY000]: Общая ошибка: 1215 Не удается добавить ограничение внешнего ключа
Перенос проб:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
$table->timestamps();
});
Перенос поставщика:
Schema::create('suppliers', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('supplier',50);
$table->timestamps();
});
Я пытаюсь сделать это с новой миграцией для образцов, но не увенчался успехом:
Schema::create('samples', function (Blueprint $table) {
$table->Increments('id',true);
$table->string('variety',50);
$table->integer('supplier_id')->unsigned();
$table->string('lot_number');
$table->date('date');
$table->integer('amount');
$table->integer('unit_id')->unsigned();
$table->string('technical_fact');
$table->string('comments');
$table->string('file_address');
$table->integer('category_id')->unsigned();
$table->timestamps();
});
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
Я пытаюсь исправить длину первичного ключа до 10, но неудачно снова
Ответы
Ответ 1
Заказ имеет значение.
Вы хотите убедиться, что ваша таблица "поставщиков" существует, прежде чем пытаться ссылаться на столбец этой таблицы в качестве ограничения.
Поэтому, если вы хотите установить ограничение внешнего ключа при создании таблицы, убедитесь, что сначала вы создали миграцию " поставщиков ", а затем миграцию " образцов ":
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration create_samples_table --create=samples
... добавить код схемы в ваши файлы миграции. а потом:
php artisan migrate
Если вы не хотите беспокоиться о порядке создания таблиц, сначала выполните миграцию create_table без ограничений внешнего ключа, а затем выполните дополнительную миграцию, чтобы добавить внешние ключи.
php artisan make:migration create_samples_table --create=samples
php artisan make:migration create_suppliers_table --create=suppliers
php artisan make:migration alter_samples_table --table=samples <-- add your foreign key constraints to this migration file
... добавить код схемы в ваши файлы миграции. А затем перенести с помощью:
php artisan migrate
Ответ 2
Наконец, сгенерируйте миграцию для таблицы, помните, что они должны быть в порядке, если вы чувствуете, что какие-либо разногласия просто называют ur table_foreign_keys
Schema::table('samples', function($table) {
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->foreign('unit_id')->references('id')->on('unit');
$table->foreign('category_id')->references('id')->on('category');
});
поместите сюда все внешние ключи и запустите
Ответ 3
попробуйте этот путь
Schema::table('samples', function($table) {
$table->integer('supplier_id')->unsigned();
$table->foreign('supplier_id')->references('id')->on('suppliers');
$table->integer('unit_id')->unsigned();
$table->foreign('unit_id')->references('id')->on('unit');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('category');
});
Ответ 4
Коррей D сказать правду!, но я создал миграции, а затем переименовал миграцию, чтобы переупорядочить их. Это так просто:
Перед переименованием:
Перенос поставщика: 2015_08_ 21 _104217_supllier_table.php
Перенос проб: 2015_08_ 22 _102325_samples_table.php
После переименования:
Перенос проб: 2015_08_ 21 _102325_samples_table.php
Перенос поставщика: 2015_08_ 22 _104217_supllier_table.php
моя проблема решена! потому что миграция поставщика выполняется до миграции образцов
Комментарий: я пытаюсь сделать это с помощью отражателя, который переименовал все, где использовалось имя миграции
Ответ 5
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
Ответ 6
Все правы, но самый простой способ - создать обычные файлы миграции. Например, у вас будет 2019_01_21_123456_create_table_one_table.php...
Я переименовал их всех
2019_01_21_0010_create_table_one_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php
Теперь, если мне нужно добавить миграцию до table_two и после table_one, я могу просто изменить ее на
2019_01_21_0015_create_table_five_table.php
Теперь порядок миграции будет
2019_01_21_0010_create_table_one_table.php
2019_01_21_0015_create_table_five_table.php
2019_01_21_0020_create_table_two_table.php
2019_01_21_0030_create_table_three_table.php
2019_01_21_0040_create_table_four_table.php