Cara Atasi Error Foreign key constraint is incorrectly formed Saat Melakukan Migrate di Laravel
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
.
1 comment