何が起きたか
hoge
テーブルに users
テーブルのid
で外部制約キーを設定しようと migrate 実行時にエラーが
結論
bigInteger
で制約を付けたいカラムにを定義しないと、 migration
ファイル作成時に記述されている $table->id()
と型が異なってしまう
知っていればつまづくポイントにもならないと思いますが、自分の備忘録として・・・
エラーパターン
migration
// users テーブル
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('login_id');
$table->string('password');
$table->timestamps();
});
}
// hoge テーブル
public function up()
{
Schema::create('hoge', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('user_id')->unsigned();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
エラー内容
エラーを見ると
Cannot add foreign key constraint
...エラーが起きたのどこだろ
MySqlの場合下記実行でエラー内容の詳細が見れる。
SHOW ENGINE INNODB STATUS;
status
カラムの LATEST FOREIGN KEY ERROR
とある部分を見ると
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
エラーに従って users
の id
と hoge
の user_id
をチェックすると
users.id
は BIGINT
hoge.user_id
は INT
型が違った
修正内容
hoge
テーブルの user_id
定義を変更してやればOK
// hoge テーブル 修正後
public function up()
{
Schema::create('hoge', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->bigInteger('user_id')->unsigned();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}