Laravel Migration: Panduan Lengkap Membuat dan Migrate Database
Laravel migration adalah fitur penting untuk mengelola perubahan struktur database secara rapi, konsisten, dan bisa dilacak lewat kode. Dengan migration, Anda tidak perlu menjalankan SQL manual setiap kali membuat tabel, menambah kolom, mengubah index, atau menyesuaikan relasi database di aplikasi Laravel.
Artikel ini membahas laravel migrations dari dasar sampai teknik yang dipakai di proyek production: mulai dari php artisan make:migration, struktur file migration, tipe kolom, index, rollback, sampai cara migrate database Laravel yang aman saat aplikasi sudah digunakan user.
Apa Itu Migration?
Migration adalah cara Laravel mengelola struktur database lewat kode PHP, bukan lewat SQL manual. Setiap migration adalah “version control” untuk database Anda.
Keuntungan migration:
- Semua developer di tim punya struktur database yang sama
- Perubahan terlacak di git dan bisa di-review
- Mudah rollback jika ada kesalahan
- Dokumentasi struktur database ada di kode
- Deployment ke production lebih aman dan terukur
Membuat Migration
# Buat tabel baru
php artisan make:migration create_articles_table
# Modifikasi tabel yang sudah ada
php artisan make:migration add_published_at_to_articles_table
# Migration sekalian dengan model dan factory
php artisan make:model Article -m
File migration dibuat di folder database/migrations/ dengan timestamp sebagai prefix, contoh: 2026_05_18_120000_create_articles_table.php
Struktur Migration
Migration punya dua method: up() untuk apply, down() untuk rollback.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('title');
$table->string('slug')->unique();
$table->text('content');
$table->enum('status', ['draft', 'published'])->default('draft');
$table->timestamp('published_at')->nullable();
$table->timestamps();
$table->softDeletes();
});
}
public function down(): void
{
Schema::dropIfExists('articles');
}
};
Tipe Kolom yang Paling Sering Dipakai
$table->id(); // bigint unsigned auto-increment primary key
$table->string('name'); // VARCHAR(255)
$table->string('code', 10); // VARCHAR(10)
$table->text('body'); // TEXT
$table->longText('content'); // LONGTEXT
$table->integer('qty'); // INT
$table->bigInteger('views'); // BIGINT
$table->decimal('price', 10, 2); // DECIMAL(10,2)
$table->boolean('is_active'); // TINYINT(1)
$table->date('birth_date'); // DATE
$table->timestamp('sent_at'); // TIMESTAMP
$table->timestamps(); // created_at + updated_at
$table->softDeletes(); // deleted_at (soft delete)
$table->json('metadata'); // JSON
$table->uuid('identifier'); // UUID
$table->enum('status', ['draft', 'published']); // ENUM
Modifikasi Kolom yang Sudah Ada
Untuk mengubah kolom yang sudah ada, gunakan method change():
Schema::table('articles', function (Blueprint $table) {
// Ubah tipe kolom
$table->string('title', 500)->change();
// Tambah kolom baru
$table->string('author')->after('title');
// Rename kolom
$table->renameColumn('old_name', 'new_name');
// Drop kolom
$table->dropColumn('deprecated_field');
});
Index untuk Performa Query
Index membuat query lebih cepat, terutama untuk tabel besar:
// Primary key (otomatis dari id())
$table->id();
// Unique index
$table->string('email')->unique();
// Regular index
$table->index('status');
// Composite index (multiple columns)
$table->index(['user_id', 'created_at']);
// Full text index (untuk search)
$table->fullText('content');
// Drop index
$table->dropIndex('articles_status_index');
Menjalankan Migration
# Jalankan semua migration yang belum dijalankan
php artisan migrate
# Jalankan migration tertentu
php artisan migrate --path=database/migrations/2026_05_18_create_articles_table.php
# Lihat status semua migration
php artisan migrate:status
# Rollback migration terakhir
php artisan migrate:rollback
# Rollback semua migration
php artisan migrate:reset
# Rollback semua + jalankan ulang
php artisan migrate:fresh
# Migrate + seed sekaligus
php artisan migrate:fresh --seed
Perhatian:
migrate:freshakan menghapus semua tabel dan data. Jangan jalankan di production.
Migration di Production: Aturan Aman
Saat aplikasi sudah live dengan user, migration harus dilakukan dengan hati-hati:
Pola Rollback Aman di Production
1. Pisahkan perubahan schema dan perubahan kode
Jangan ubah schema dan deploy kode baru di waktu yang sama. Urutan yang aman:
- Deploy migration (ubah schema)
- Tunggu beberapa jam untuk verifikasi
- Deploy kode baru yang menggunakan schema baru
2. Hindari rollback yang menghapus data penting
Jangan gunakan dropIfExists() atau drop() di production. Gunakan soft delete atau archive:
// ❌ Jangan lakukan ini di production
public function down(): void {
Schema::dropIfExists('articles');
}
// ✅ Lebih aman: rename atau archive
public function down(): void {
Schema::rename('articles', 'articles_archived');
}
3. Gunakan maintenance window untuk perubahan berat
Untuk perubahan schema yang berat (rename kolom, change type), lakukan saat traffic rendah:
// Aktifkan maintenance mode
php artisan down --secret="token123"
// Jalankan migration
php artisan migrate
// Matikan maintenance mode
php artisan up
4. Cek status migration setelah deploy
php artisan migrate:status
FAQ: Pertanyaan Umum tentang Migration Laravel
Apa perbedaan migrate:fresh dan migrate:reset?
migrate:reset hanya rollback semua migration. migrate:fresh rollback semua + jalankan ulang. Gunakan migrate:fresh untuk development, jangan di production.
Bagaimana cara rollback migration tertentu, bukan yang terakhir?
Tidak ada command langsung untuk rollback migration tertentu. Solusinya: rollback sampai sebelum migration yang ingin di-rollback, lalu migrate ulang yang diperlukan.
Apa yang terjadi jika migration gagal di tengah jalan?
Laravel akan stop dan tidak melanjutkan migration berikutnya. Cek error, fix migration file, lalu jalankan php artisan migrate lagi.
Kapan perlu buat migration baru vs modifikasi migration lama?
Jika migration belum di-push ke repository atau production, boleh modifikasi. Jika sudah di-push, buat migration baru untuk perubahan tambahan.
Apakah nama file migration berpengaruh?
Nama file tidak berpengaruh pada eksekusi, tapi gunakan nama yang deskriptif untuk dokumentasi. Timestamp di awal file yang menentukan urutan eksekusi.
Butuh Bantuan Pengembangan Laravel?
Jika Anda membutuhkan bantuan dalam pengembangan aplikasi Laravel yang lebih kompleks, tim developer Arrazy Inovasi siap membantu. Kami berpengalaman dalam membangun aplikasi web Laravel untuk berbagai kebutuhan bisnis, termasuk database design dan migration strategy.
Untuk konsultasi lebih lanjut tentang proyek Laravel Anda, silakan hubungi kami.
Baca Juga
Artikel Lainnya di Kategori Laravel
10 November 2025
Concurrency Adalah? Cara Kerja Concurrency di Laravel 12
Concurrency adalah teknik menjalankan proses secara bersamaan. Pelajari cara kerja Laravel Concurrency, contoh penggunaan, perbedaan dengan queue, dan kapan memakainya.
Baca Artikel9 November 2025
Notification di Laravel 12: Email, Database, dan Channel Kustom
Hampir semua aplikasi web butuh notifikasi: konfirmasi order, reset password, atau pemberitahuan saat ada komentar baru. Laravel punya sistem notifikasi yang cukup fleksibel: satu kelas bisa kirim ke email, database, Slack, dan channel lain sekaligus. Artikel ini membahas cara kerja notification di Laravel 12, mulai dari membuat kelas notifikasi, kirim via email dan database, sampai […]
Baca Artikel9 November 2025
Tutorial Laravel 12 Job Batching: Implementasi, Progress, dan Error Handling
Bayangkan Anda perlu kirim email ke 5.000 pengguna sekaligus, atau proses 1.000 gambar setelah upload. Kalau dijalankan satu per satu lewat queue biasa, Anda tidak tahu kapan semuanya selesai, dan tidak bisa jalankan aksi “setelah semua beres”. Job Batching di Laravel menyelesaikan masalah ini. Artikel ini membahas cara kerjanya, implementasi lengkap dengan contoh kode, dan […]
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel