Laravel

Panduan Lengkap Laravel Migrations

06 Jun 2026 Administrator
Header Hero

Panduan Lengkap Laravel Migrations

Version Control Database, Schema Builder, Modifikasi Tabel, dan Manajemen CLI Artisan

Dalam siklus pengembangan aplikasi tim maupun mandiri, pengelolaan struktur database sering kali menjadi kendala besar. Perubahan manual seperti menambah kolom baru, mengubah tipe data, atau membangun relasi antar tabel langsung di dalam DBMS (seperti phpMyAdmin atau Navicat) berisiko memicu ketidaksinkronan skema antar komputer *developer*. Untuk mengatasi masalah fragmentasi ini, framework Laravel menyediakan fitur bernama Migrations, yang bertindak seperti sistem *version control* (seperti Git) namun khusus untuk arsitektur skema database Anda.

Melalui Laravel Migrations, Anda dapat mendefinisikan, memodifikasi, dan menghapus struktur tabel secara terprogram (*programmatically*) menggunakan kode PHP murni. Setiap perubahan dicatat ke dalam berkas berbasis waktu (*timestamped files*), sehingga seluruh anggota tim pengembang cukup menjalankan satu perintah di terminal untuk menyamakan struktur database terbaru. Fitur ini menjamin konsistensi skema database yang presisi saat aplikasi didistribusikan dari lingkungan pengembangan lokal, fase pengetesan (*testing*), hingga server produksi (*deployment*).

Anatomi Berkas: Setiap file migrasi selalu memiliki dua metode utama yang berpasangan secara logis: up() untuk mengeksekusi pembuatan atau modifikasi tabel baru, dan down() untuk membatalkan (*rollback*) operasi yang dilakukan oleh metode up() jika sewaktu-waktu terjadi kesalahan.

1. Pembuatan Berkas Migrasi Menggunakan CLI Artisan

Gunakan baris perintah kode terminal Artisan untuk membuat cetak biru file migrasi baru secara otomatis:

# Membuat migrasi dasar untuk membuat tabel 'users' baru
php artisan make:migration create_users_table --create=users

# Membuat migrasi khusus untuk memodifikasi atau menambah kolom di tabel yang sudah ada
php artisan make:migration add_last_login_to_users_table --table=users

File baru akan tersimpan di direktori database/migrations/ dengan prefiks waktu pembuatan. Berikut adalah arsitektur struktur dasarnya:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Jalankan operasi migrasi (Membangun Struktur).
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // Primary Key auto-increment (BigInteger)
            $table->string('name'); // Kolom VARCHAR
            $table->string('email')->unique(); // Atribut kolom bernilai unik
            $table->string('password');
            $table->timestamps(); // Otomatis membuat kolom 'created_at' dan 'updated_at'
        });
    }

    /**
     * Batalkan operasi migrasi (Kebalikan dari method up).
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};
Langkah 2

Pemanfaatan Tipe Data Kolom & Modifiers

Laravel Schema Builder mendukung penuh semua tipe data kolom database populer serta atribut modifikator (*column modifiers*) tambahan untuk menentukan karakteristik data:

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title', 150); // VARCHAR dengan batasan panjang 150 karakter
    $table->text('content'); // Tipe data TEXT untuk konten panjang
    $table->boolean('is_published')->default(false); // Nilai bawaan BOOLEAN false
    $table->integer('views_count')->unsigned()->default(0); // Angka positif (UNSIGNED)
    $table->string('slug')->nullable()->index(); // Kolom boleh kosong & disematkan INDEX performa
    $table->json('metadata')->nullable(); // Dukungan tipe data JSON
    
    // Pembuatan Foreign Key Relasional terintegrasi ke tabel users
    $table->foreignId('user_id')->constrained()->onDelete('cascade');
    $table->timestamps();
});
Langkah 3

Mengubah atau Memodifikasi Struktur Tabel yang Ada

Jangan pernah mengubah file direktori migrasi lama yang sudah dieksekusi (*deployed*) ke server produksi. Sebagai gantinya, buat berkas migrasi baru menggunakan fungsi Schema::table untuk memodifikasi skema:

// Menambahkan kolom baru ke tabel users secara spesifik sesudah kolom email
public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->timestamp('last_login_at')->nullable()->after('email');
    });
}

// Wajib definisikan fungsi pembatalan kolom di method down agar bisa di-rollback
public function down(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('last_login_at');
    });
}

2. Daftar Perintah CLI Eksekusi Migrasi

Kelola siklus status migrasi database Anda di terminal melalui eksekusi baris CLI Artisan berikut:

# Menjalankan seluruh berkas migrasi baru yang belum pernah dieksekusi
php artisan migrate

# Memeriksa status berkas migrasi (Melihat file mana yang sudah/belum dieksekusi)
php artisan migrate:status

# Mematikan (Rollback) 1 langkah atau batch eksekusi migrasi terakhir
php artisan migrate:rollback

# Mematikan secara spesifik sejumlah langkah ke belakang
php artisan migrate:rollback --step=3

# Mengosongkan database total (Drop All Tables) dan membangun ulang dari awal skema baru
php artisan migrate:fresh

# Memaksa jalannya perintah eksekusi migrasi jika berada di server lingkungan produksi
php artisan migrate --force
Praktik Terbaik & Aturan Keamanan Jaringan Migrasi

Penerapan aturan migrasi yang keliru dapat merusak integritas data utama di server produksi. Selalu ikuti standarisasi baku berikut:

  • Jangan Pernah Gunakan Perintah `migrate:fresh` di Produksi: Perintah migrate:fresh akan menghapus seluruh skema tabel beserta seluruh data transaksi di dalamnya secara permanen tanpa konfirmasi. Batasi hak akses terminal hanya untuk perintah migrate standar.
  • Gunakan Nama Berkas Deskriptif: Tulis penamaan file migrasi dengan format yang merepresentasikan aksinya secara jelas, contoh: create_products_table atau add_discount_price_to_products_table untuk memudahkan penelusuran riwayat tim Git.
  • Lengkapi Metode Down Secara Presisi: Selalu pastikan fungsi di dalam metode down() membatalkan secara akurat apa yang dibuat di metode up(). Jika metode up menambahkan kolom, metode down wajib menggunakan perintah dropColumn() agar proses perbaikan bug (*hotfix rollback*) berjalan tanpa galat.
  • Sematkan Index pada Kolom Pencarian: Untuk kolom yang sering digunakan sebagai filter pencarian data atau klausa WHERE (seperti status, slug, atau kategori), tambahkan atribut modifikator ->index() untuk meningkatkan performa komputasi pembacaan query SQL server Anda.
v