Cara Atasi Error "Can’t DROP FOREIGN KEY" Saat Melakukan Migrate Refresh di Laravel 8


Hai sobat coder Cafeteria, kalian pasti pernah menemukan error seperti ini:

SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP FOREIGN KEY `column_name`; check that it exists (SQL: alter table `table_name` drop foreign key `column_name`)

Biasanya error itu muncul ketika kita akan melakukan migrate ulang table kita yang memiliki column foreign key atau kolum yang terhubung dengan table lain. Perintah yang dijalankan untuk melakukan migrate adalah:

php artisan migrate:refresh --seed

Error itu tidak muncul kalau kita menggunakan migrate:fresh bukan migrate:refresh. Akan tetapi bagaimana caranya agar tidak lagi terjadi error jika menggunakan perintah migrate:refresh?

Dalam kasus yang saya miliki kolom yang memiliki foreign key tersebut dibuat terpisah dari tablenya, artinya tablenya tersebut dibuat lebih dulu lalu ditambahkan kolom baru dengan perintah make:migration untuk membuat file migration, contoh:

php artisan make:migration add_user_id_to_posts --table=posts

Di dalam file migration tersebut saya isikan untuk method up dan down-nya sebagai berikut:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedBigInteger('user_id')->after('content);
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropForeign('user_id');
        $table->dropColumn('user_id');
    });
}

Dan ketika saya coba untuk melakukan migrate:fresh ternyata berhasil. Lain halnya ketika saya coba dengan perintah migrate:refresh ternyata muncul error.

Akhirnya masalah ini solved dengan hanya menambahkan pada method down yang sebelumnya $table->dropForeign('user_id'); menjadi $table->dropForeign(['user_id']); . Ya, hanya dengan memasukkannya ke dalam bentuk array..

Keseluruhan akhir yang kita dapati sekarang:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->unsignedBigInteger('user_id')->after('content);
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropForeign(['user_id']);
        $table->dropColumn('user_id');
    });
}

Semoga bermanfaat…