データベースに外部キーを使用する必要がありますが、これはできません。コマンドラインで移行コマンドを実行した後、次のエラーが発生します。
[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に固定しようとしましたが、再び失敗しました
順序は重要です。
そのテーブルの列を制約として参照する前に、「サプライヤ」テーブルが存在することを確認する必要があります。
したがって、テーブルの作成中に外部キー制約を設定する場合は、最初に "suppliers"の移行を作成し、その後に "samples"の移行を作成してください。
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
最後に、テーブルのマイグレーションを生成します。urtable_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');
});
最後にここに関連するすべての外部キーを配置して実行します
このようにしてみてください
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');
});
KorreyDは本当と言う! 、しかし私はマイグレーションを作成し、次にそれらを並べ替えるためにマイグレーションの名前を変更しました、それはとても簡単です:
名前を変更する前:
サプライヤーの移行: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
私の問題は解決しました!サプライヤーの移行はサンプルの移行の前に実行されるため
コメント:私はこれをリフレクターで試してみましたが、移行名を使用した場所の名前を変更しました
Schema::table('posts', function (Blueprint $table) {
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
誰もが正しいですが、最も簡単な方法は、通常どおりマイグレーションファイルを作成することです。あなたが持っているでしょう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