Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

またもや引っかかったのでいい加減にメモっとく。(数ヶ月ぶり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投稿記事の再投稿です。
前記事は内容がアレだったので閲覧数が付く前に削除した次第。正直すまんかった。

0w0
0w0です。宇宙より飛来し地球人に紛れて仕事をしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした