web-dev-qa-db-ja.com

laravel 5.1移行で外部キーを使用する方法

データベースに外部キーを使用する必要がありますが、これはできません。コマンドラインで移行コマンドを実行した後、次のエラーが発生します。

[Illuminate\Database\QueryException] SQLSTATE [HY000]:一般エラー:1215外部キー制約を追加できません(SQL:変更テーブルsamples追加制約s amples_supplier_id_foreign外部キー(supplier_id)参照suppliersid))

[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に固定しようとしましたが、再び失敗しました

10
Abolfazl Yavari

順序は重要です。

そのテーブルの列を制約として参照する前に、「サプライヤ」テーブルが存在することを確認する必要があります。

したがって、テーブルの作成中に外部キー制約を設定する場合は、最初に "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
7
KorreyD

最後に、テーブルのマイグレーションを生成します。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');
        });

最後にここに関連するすべての外部キーを配置して実行します

5
ujwal dhakal

このようにしてみてください

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

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

私の問題は解決しました!サプライヤーの移行はサンプルの移行の前に実行されるため

コメント:私はこれをリフレクターで試してみましたが、移行名を使用した場所の名前を変更しました

1
Abolfazl Yavari
Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});
0
Bashirpour

誰もが正しいですが、最も簡単な方法は、通常どおりマイグレーションファイルを作成することです。あなたが持っているでしょう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
0
dmgd