Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
129
Help us understand the problem. What is going on with this article?
@0w0

【メモ】【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投稿記事の再投稿です。
前記事は内容がアレだったので閲覧数が付く前に削除した次第。正直すまんかった。

129
Help us understand the problem. What is going on with this article?
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
0w0
0w0です。宇宙より飛来し地球人に紛れて仕事をしています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
129
Help us understand the problem. What is going on with this article?