何故人は同じ過ちを繰り返すのか
またもや引っかかったのでいい加減にメモっとく。(数ヶ月ぶり3度目)
Laravelの気遣いに人がついて行けてないパターンの初歩的なアレです。
こんな構成のテーブルを作りたいとするじゃろ
とりあえずこう書くじゃろ
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_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投稿記事の再投稿です。
前記事は内容がアレだったので閲覧数が付く前に削除した次第。正直すまんかった。