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

## 何故人は同じ過ちを繰り返すのか
またもや引っかかったのでいい加減にメモっとく。（数ヶ月ぶり3度目）
Laravelの気遣いに人がついて行けてないパターンの初歩的なアレです。

## こんな構成のテーブルを作りたいとするじゃろ
![Kobito.rvZZj6.png](https://qiita-image-store.s3.amazonaws.com/0/154302/edf4ffd4-b039-cd10-ffc1-f28799b35530.png "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するとこうじゃ
``` console
$ 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_id```と```authority_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投稿記事の再投稿です。
前記事は内容がアレだったので閲覧数が付く前に削除した次第。正直すまんかった。