Cara Atasi Error Foreign key constraint is incorrectly formed Saat Melakukan Migrate di Laravel

Error Foreign key constraint is incorrectly formed

Bagi pengguna Laravel pasti pernah mengalami error masalah foreign key saat melakukan migrasi tabel. Dalam contoh kasusnya kami ingin menghubungkan user_id pada tabel posts ke id pada tabel users dengan isi skema file migration post sebagai berikut:

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')
       ->references('id')->on('users')
       ->onDelete('cascade');
    $table->text('content');
    $table->timestamps();
});


Kemudian saat dijalankan dengan perintah

php artisan migrate


Muncul error:

Illuminate\Database\QueryException  : SQLSTATE[HY000]: General error: 1005 Can't create table `blog`.`#sql-27fc_41` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `posts` add constraint `posts_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)


Cara Mengatasi

Pada Laravel terbaru, terutama yang kami pakai yaitu versi 5.8, memang terjadi perubahan pada kolom id pada tabel database yang menggunakan tipe data big integer (bigint) atau dalam skema Laravel ditulis bigIncrements.

Perthatikan pada skema untuk membuat tabel users di bawah ini:

Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});


Terlihat pada id untuk tipe datanya dituliskan bigIncrements. Hal ini akan timbul masalah jika kalian tidak menyesuaikannya saat menulis foreign key pada tabel lain, seperti pada contoh kasus kami.

Jadi bagaimana seharusnya dituliskan agar tidak menghasilkan error?

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id'); // sebaiknya ganti juga dengan $table->bigIncrements('id');
    $table->string('title');
    $table->integer('user_id')->unsigned(); // ganti menjadi $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')
       ->references('id')->on('users')
       ->onDelete('cascade');
    $table->text('content');
    $table->timestamps();
});

Cukup mengganti $table->integer('user_id')->unsigned() menjadi $table->unsignedBigInteger('user_id'); dan untuk id posts juga ubah dari increments ke bigIncrements.

Kemudian, jalankan kembali dengan perintah php artisan migrate:fresh.