Kembali ke Artikel
9 November 2025
vandyahmad24
Diperbarui: 19 Mei 2026

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:fresh akan 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:

  1. Deploy migration (ubah schema)
  2. Tunggu beberapa jam untuk verifikasi
  3. 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

Tag: #laravel #php #tutorial
BACA JUGA

Artikel Lainnya di Kategori Laravel

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel