2016-03-27 70 views
1

移行で外部キー制約を追加しようとしました。何らかの理由で、nullableに設定しても機能しますが、nullableにしないとうまく動作しません。なぜこれが起こり、どのように私はこれを解決できますか?Laravel - 1215外部キー制約を追加できません

これが行う作業:

Schema::create('role_user', function (Blueprint $table){ 
     $table->increments('id'); 

     $table->integer('role_id')->unsigned()->index(); 
     $table->foreign('role_id')->references('id')->on('roles')->onDelete('set null'); 

     $table->integer('user_id')->unsigned()->index()->nullable(); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); 

     $table->timestamps(); 
    }); 

役割とユーザーテーブル、これらの制約を行う前に、既にexcist両方:

Schema::create('role_user', function (Blueprint $table){ 
     $table->increments('id'); 

     $table->integer('role_id')->unsigned()->index()->nullable(); 
     $table->foreign('role_id')->references('id')->on('roles')->onDelete('set null'); 

     $table->integer('user_id')->unsigned()->index()->nullable(); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('set null'); 

     $table->timestamps(); 
    }); 

これは例外をスローします。私は彼らがヌル可能でないように(彼らは満たされなければならない)。エラー:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table role_user add constraint role_user_role_id_foreign foreign key (role_id) references roles (id) on delete set null)

答えて

2

移行は、ファイル名で指定した順序で起こります。おそらくあなたの役割のテーブルは、この移行が実行され、あなたのDBが(まだ)存在しないテーブルのフィールドを参照しようとしていると文句を言う時に作成されていないでしょうか?例えば

:追加されました解決策:2016_03_27_0000_first2016_03_28_0000_second

UPDATEの前に実行されます。

nullDelleableとして設定しようとしているフィールドに「onDelete( 'set null')」があることに気付きました。ロールが削除された場合は、値をnullに設定しようとするため、ロールを削除すると問題が発生します。

あなたが外部キーの両方に設定する必要があります:ユーザーまたはロールが削除されます場合は、それらに関連する団体も自動的に削除されますと、単にnullに設定したり、ぶらぶら残っていないでしょう。この方法で

->onDelete('cascade') 

を。

いいえお返事

+0

私もそれを理解して正しい順序で入れても、まだ動作しません。このSQLの一般的なエラーの種類が間違っている可能性のある幅広い範囲を持っていることは残念です。 – Markinson

+1

ああ、私はあなたにも 'onDelete( 'set null');'を持っていることに気付きました。 -nullable。ロールが削除され、このエントリにカスケードしてnullに設定しようとすると、問題が発生します。おそらく、両方の外部キーを ' - > onDelete( 'cascade');に設定しようとしなければならないかもしれません;そのようにして、ユーザーまたはロールのいずれかが削除された場合、それらに関連する関連も削除されます。 –

+0

いいです!私はそれを試して、それがすぐに働くかどうかを知らせます。 – Markinson

関連する問題