Laravel Migration Gagal: Cara Membaca Error SQL
Laravel migration gagal biasanya berarti struktur database yang diminta file migration tidak cocok dengan kondisi database saat ini. Jawaban cepatnya: baca pesan error SQL paling bawah, cek nama tabel/kolom, urutan migration, foreign key, dan koneksi database yang sedang dipakai.
Untuk pemula, error migration sering terlihat seperti masalah Laravel, padahal petunjuk utamanya ada di pesan database seperti Base table or view already exists, Cannot add foreign key constraint, atau Unknown database. Laravel hanya menjalankan instruksi schema; database yang menolak jika instruksinya tidak valid.
Kapan Masalah Ini Biasanya Muncul?
php artisan migrateberhenti di tengah jalan- tabel tidak terbentuk walaupun file migration sudah ada
- migration berhasil di laptop teman, tetapi gagal di laptop kamu
- error muncul setelah mengubah nama tabel atau nama kolom
- migration gagal saat menambah foreign key
- test Laravel gagal karena database testing belum sinkron
Penyebab Paling Umum
1. Database Belum Dibuat atau Koneksi Salah
Kalau .env menunjuk ke database yang belum ada, migration tidak bisa berjalan.
Jika database toko_laravel belum dibuat, MySQL bisa mengembalikan error seperti Unknown database.
2. Tabel Sudah Ada
Error seperti ini sering muncul saat kamu pernah membuat tabel manual, lalu menjalankan migration yang membuat tabel dengan nama sama.
Artinya Laravel mencoba membuat tabel produk, tetapi database sudah punya tabel itu.
3. Urutan Migration Salah
Laravel menjalankan migration berdasarkan timestamp di awal nama file:
Kalau tabel produks punya foreign key ke kategoris, migration kategoris harus jalan lebih dulu.
4. Nama Tabel atau Kolom Tidak Cocok
Contoh salah:
Kalau tabel sebenarnya bernama kategoris, constraint ke categories akan gagal.
5. Foreign Key Tidak Cocok Tipe Datanya
Kolom foreign key harus cocok dengan kolom tujuan. Cara paling aman adalah memakai foreignId() dan constrained().
Ini lebih aman daripada membuat integer manual lalu menulis foreign key sendiri.
Langkah Diagnosis
- Jalankan migration dan baca error paling bawah, bukan hanya baris pertama.
- Cek
.env:DB_DATABASE,DB_USERNAME, danDB_PASSWORD. - Jalankan
php artisan migrate:statusuntuk melihat migration mana yang sudah jalan. - Buka file migration terakhir yang gagal.
- Bandingkan nama tabel dan kolom dengan schema database yang benar.
- Kalau error foreign key, cek apakah tabel tujuan sudah dibuat lebih dulu.
- Bersihkan config cache jika baru mengubah
.env.
Kalau error menyebut 42S01, fokus ke tabel yang sudah ada. Kalau menyebut foreign key, fokus ke urutan tabel, nama tabel tujuan, dan tipe kolom.
Langkah Fix
1. Pastikan Database Ada
Buat database dulu di MySQL sebelum menjalankan migration.
Lalu pastikan .env memakai nama yang sama.
2. Kalau Tabel Sudah Ada, Jangan Langsung Hapus Sembarangan
Untuk project belajar yang datanya boleh hilang, kamu bisa reset database:
Kalau ada seeder:
Untuk project yang sudah punya data penting, jangan pakai migrate:fresh. Buat migration baru untuk mengubah struktur tabel.
3. Perbaiki Urutan Migration
Pastikan tabel induk dibuat sebelum tabel anak.
4. Gunakan Nama Constraint yang Jelas Saat Perlu
Kadang constraint lama masih tersisa saat refactor. Untuk perubahan struktur, buat migration baru yang eksplisit.
5. Pisahkan Database Development dan Testing
Jangan sampai test menulis ke database development. Untuk test, pakai database khusus atau SQLite.
Contoh Sebelum dan Sesudah
Sebelum
Masalahnya: tabel tujuan ditulis kategori, padahal migration membuat kategoris.
Sesudah
Kode lebih pendek dan nama tabel tujuan jelas.
Kesalahan yang Sering Terjadi
Langsung Menjalankan migrate:fresh di Project Berisi Data Penting
migrate:fresh menghapus semua tabel lalu membuat ulang. Aman untuk belajar, berbahaya untuk database yang sudah berisi data penting.
Mengubah File Migration Lama Setelah Sudah Dijalankan
Kalau migration sudah pernah jalan di database lain, lebih aman membuat migration baru untuk perubahan berikutnya.
Lupa Membersihkan Config Cache Setelah Mengubah .env
Laravel bisa masih memakai config lama. Jalankan php artisan optimize:clear setelah mengganti koneksi database.
Membuat Foreign Key Sebelum Tabel Tujuan Ada
Urutan migration penting. Tabel yang direferensikan harus sudah ada lebih dulu.
Pencegahan
- Beri nama migration sesuai perubahan yang dilakukan.
- Jalankan
migrate:statussebelum panik. - Gunakan
foreignId()->constrained()untuk relasi sederhana. - Pisahkan database development dan testing.
- Jangan edit migration lama yang sudah dipakai banyak environment.
Bacaan Terkait
- Pengenalan Laravel
- Resource Controller
- Testing dengan Pest
- Kenapa Route Model Binding Laravel Gagal?
- Panduan Error Laravel
FAQ
Kenapa migration gagal padahal kode saya terlihat benar?
Kemungkinan kondisi database tidak sama dengan asumsi migration: tabel sudah ada, tabel tujuan foreign key belum ada, atau koneksi database berbeda.
Apakah aman memakai php artisan migrate:fresh?
Aman untuk project belajar atau database lokal yang datanya boleh hilang. Jangan jalankan di production kecuali kamu benar-benar tahu risikonya.
Kenapa setelah mengubah .env, migration masih memakai database lama?
Biasanya config Laravel masih tercache. Jalankan php artisan optimize:clear, lalu ulangi migration.
Apa bedanya migrate, migrate:fresh, dan migrate:refresh?
migrate menjalankan migration yang belum jalan. migrate:fresh menghapus semua tabel lalu menjalankan migration dari awal. migrate:refresh rollback lalu migrate ulang.