BAB 27: Menjalankan Migration
Menjalankan migrasi untuk membuat tabel di database dan memverifikasi hasilnya.
Model dan file migrasi sudah lengkap — struktur tabel catatan sudah terdefinisi di PHP. Tapi selama php artisan migrate belum dijalankan, semua itu masih definisi di atas kertas. Database belum tahu apa-apa tentang tabel yang kita rancang.
Menjalankan Migrasi
Dari dalam direktori proyek, jalankan:
php artisan migrate
Laravel membaca semua file di database/migrations/ yang belum pernah dijalankan, mengurutkannya berdasarkan timestamp di nama file, lalu mengeksekusinya satu per satu. Output yang muncul:
INFO Running migrations.
0001_01_01_000000_create_users_table ...................... 42ms DONE
0001_01_01_000001_create_cache_table ...................... 15ms DONE
0001_01_01_000002_create_jobs_table ....................... 18ms DONE
2026_03_17_020947_create_catatans_table ................... 28ms DONE
Keempat migration dijalankan sekaligus karena ini adalah pertama kalinya migrate dijalankan di project ini. Tiga migration pertama adalah bawaan Laravel, sementara yang terakhir adalah migration catatan yang baru saja kita buat. Baris DONE di baris terakhir mengonfirmasi tabel catatan sudah berhasil dibuat. Laravel juga mencatat migrasi ini ke tabel migrations — tabel internal yang Laravel kelola sendiri untuk melacak migrasi mana yang sudah dijalankan.
Memverifikasi Tabel di Database
Menjalankan migrasi tanpa memverifikasi hasilnya adalah kebiasaan yang perlu dihindari. Ada dua cara untuk memastikan struktur tabel sesuai rencana.
Cara pertama: masuk langsung ke MySQL client.
mysql -u root -p manajemen_catatan
DESCRIBE catatan;
Output yang muncul akan menampilkan setiap kolom beserta tipe data, constraint, dan nilai defaultnya:
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| user_id | bigint unsigned | YES | MUL | NULL | |
| judul | varchar(255) | NO | NULL | ||
| isi | text | YES | NULL | ||
| prioritas | enum(‘rendah’,‘sedang’,‘tinggi’) | NO | sedang | ||
| selesai | tinyint(1) | NO | 0 | ||
| created_at | timestamp | YES | NULL | ||
| updated_at | timestamp | YES | NULL |
Bandingkan baris per baris dengan definisi di file migrasi. Semua kolom harus cocok — nama, tipe, dan constraint-nya.
Cara kedua: gunakan php artisan db:show untuk ringkasan tanpa harus masuk ke MySQL client.
php artisan db:show
Perintah ini menampilkan daftar semua tabel beserta jumlah baris dan ukuran. Cocok untuk overview cepat tanpa perlu syntax SQL.
Perintah Migrasi yang Sering Digunakan
Selama pengembangan, kamu akan sering berinteraksi dengan beberapa perintah migrasi. Yang paling penting untuk dihapal:
# Lihat status semua migrasi
php artisan migrate:status
Perintah ini menampilkan daftar semua file migrasi beserta statusnya:
Migration name .............................................. Batch / Status
0001_01_01_000000_create_users_table ........................ [1] Ran
0001_01_01_000001_create_cache_table ........................ [1] Ran
0001_01_01_000002_create_jobs_table ......................... [1] Ran
2026_03_17_020947_create_catatans_table ..................... [1] Ran
Kolom Batch menunjukkan dalam batch ke berapa migrasi itu dijalankan. Ini relevan saat menggunakan rollback.
# Batalkan migrasi dari batch terakhir
php artisan migrate:rollback
# Reset semua migrasi (rollback semua batch sekaligus)
php artisan migrate:reset
# Hapus semua tabel lalu jalankan ulang semua migrasi
php artisan migrate:fresh
migrate:fresh menghapus semua tabel termasuk seluruh data yang ada di dalamnya. Gunakan hanya di environment development. Jangan pernah jalankan perintah ini di database production.
rollback hanya membatalkan batch terakhir — jadi jika kamu menjalankan migrate dua kali (dua batch berbeda), rollback pertama hanya mengembalikan batch kedua. reset membatalkan semuanya sekaligus.
Jika Perlu Mengubah Struktur Tabel
Setelah migrasi dijalankan, mungkin kamu menyadari ada kolom yang terlewat atau perlu diubah. Jangan edit file migrasi yang sudah ada — file itu sudah dieksekusi dan mengubahnya tidak akan mengubah database yang sudah ada.
Buat migrasi baru untuk perubahan tersebut:
php artisan make:migration add_tenggat_to_catatan_table
Isi method up() dengan perubahan yang diinginkan, dan down() dengan cara membatalkannya:
// database/migrations/xxxx_xx_xx_xxxxxx_add_tenggat_to_catatans_table.php
public function up(): void
{
Schema::table('catatan', function (Blueprint $table) {
$table->date('tenggat')->nullable()->after('selesai');
});
}
public function down(): void
{
Schema::table('catatan', function (Blueprint $table) {
$table->dropColumn('tenggat');
});
}
Perhatikan perbedaannya: migrasi create_catatan_table menggunakan Schema::create(), sedangkan migrasi tambahan ini menggunakan Schema::table() karena tabelnya sudah ada dan hanya dimodifikasi.
Prinsip ini sama persis dengan yang dibahas di BAB 17 — migrasi adalah version control untuk database. Setiap perubahan didokumentasikan melalui file migrasi baru, bukan dengan mengedit yang lama. Dengan cara ini, seluruh tim bisa menjalankan php artisan migrate dan mendapatkan struktur database yang identik, tanpa perlu berbagi file SQL secara manual.
Tabel catatan sudah ada di database dan siap diisi data. Langkah selanjutnya adalah membangun fitur pertama: halaman yang menampilkan semua catatan yang tersimpan.