Edited at

【メモ】【Laravel】外部キー制約付きMigrateがさっぱり動かないときのチェック・ポイント(Mysql)


何故人は同じ過ちを繰り返すのか

またもや引っかかったのでいい加減にメモっとく。(数ヶ月ぶり3度目)

Laravelの気遣いに人がついて行けてないパターンの初歩的なアレです。


こんな構成のテーブルを作りたいとするじゃろ

Kobito.rvZZj6.png


とりあえずこう書くじゃろ


1_create_users_table.php

    public function up()

{
Schema::create('users', function (Blueprint $table) {
$table->increments('id'); //自動採番
$table->string('name');
});
}



2_create_authorities_table.php

    public function up()

{
Schema::create('authorities', function (Blueprint $table) {
$table->increments('id'); //自動採番
$table->string('name');
});
}


3_create_roles_table.php

    public function up()

{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id'); //自動採番
$table->integer('user_id');
$table->integer('authority_id');
$table->foreign('user_id')->references('id')->on('users'); //外部キー参照
$table->foreign('authority_id')->references('id')->on('authorities'); //外部キー参照
$table->unique(['user_id', 'authority_id'],'uq_roles'); //Laravelは複合主キーが扱いにくいのでユニークで代用
});

}



Migrateするとこうじゃ

$ php artisan migrate

Migration table created successfully.

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
: alter table `roles` add constraint `roles_user_id_foreign` foreign key (`
user_id`) references `users` (`id`))

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint


原因

原因は以下の行。


1_create_users_table.php&2_create_authorities_table

            $table->increments('id'); //自動採番



3_create_roles_table.php

            $table->integer('user_id');

$table->integer('authority_id');

 

increments()で作ったカラムには、実は裏でunsined(符号無し)属性が付与される。要は採番項目なので正の値しか登録できないわけだが、役割テーブル側のuser_idauthority_idには同様の制約を付けていない。

つまり、形式の不一致で落ちているわけですな。


というわけで、以下のように書き換える

Migrationファイル上で符号無し属性を付けるにはunsigned()構文を使えばよい。


役割テーブル作るやつ:3_create_roles_table.php

    public function up()

{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id'); //自動採番
$table->integer('user_id')->unsigned();
$table->integer('authority_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users'); //外部キー参照
$table->foreign('authority_id')->references('id')->on('authorities'); //外部キー参照
$table->unique(['user_id', 'authority_id'],'uq_roles'); //Laravelは複合主キーが扱いにくいのでユニークで代用
});

}


後はいつもどおりMigrateをかければOK。


補足

当記事は2017/11/11投稿記事の再投稿です。

前記事は内容がアレだったので閲覧数が付く前に削除した次第。正直すまんかった。