Tutorial Laravel #10: Migration di Laravel

1. Apa itu Migration?

Migration adalah cara Laravel mengelola struktur database menggunakan kode PHP - bukan SQL manual. Anggap migration seperti version control untuk database. Setiap perubahan struktur tabel (tambah kolom, ubah tipe data, buat tabel baru) dicatat dalam file migration yang bisa dijalankan, di-rollback, atau diulang kapan saja.

Keuntungannya: semua anggota tim punya struktur database yang sama cukup dengan jalankan php artisan migrate.

2. Membuat Migration

# Buat migration untuk tabel baru
php artisan make:migration create_artikels_table

# Buat migration untuk modifikasi tabel
php artisan make:migration add_status_to_artikels_table

# Buat migration sekaligus dengan model
php artisan make:model Artikel -m
# Flag -m otomatis buat migration juga

File migration disimpan di database/migrations/ dengan nama berformat YYYY_MM_DD_HHMMSS_nama_migration.php.

3. Struktur File Migration

<?php
// database/migrations/2025_01_01_000000_create_artikels_table.php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

return new class extends Migration
{
    // Dijalankan saat: php artisan migrate
    public function up(): void
    {
        Schema::create('artikels', function (Blueprint $table) {
            $table->id();                              // kolom id bigint auto increment
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->foreignId('kategori_id')->nullable()->constrained();
            $table->string('judul', 200);
            $table->string('slug')->unique();
            $table->text('deskripsi_singkat')->nullable();
            $table->longText('konten');
            $table->string('gambar')->nullable();
            $table->enum('status', ['draft', 'published'])->default('draft');
            $table->integer('views')->default(0);
            $table->timestamps();                      // kolom created_at & updated_at
            $table->softDeletes();                     // kolom deleted_at
        });
    }

    // Dijalankan saat: php artisan migrate:rollback
    public function down(): void
    {
        Schema::dropIfExists('artikels');
    }
};

4. Tipe Kolom yang Sering Dipakai

$table->id();                    // BIGINT UNSIGNED AUTO INCREMENT
$table->string('nama', 100);     // VARCHAR(100)
$table->text('deskripsi');       // TEXT
$table->longText('konten');      // LONGTEXT
$table->integer('views');        // INT
$table->bigInteger('total');     // BIGINT
$table->unsignedBigInteger('user_id'); // BIGINT UNSIGNED
$table->float('rating');         // FLOAT
$table->decimal('harga', 12, 2); // DECIMAL(12,2) - untuk uang
$table->boolean('aktif');        // TINYINT(1)
$table->date('tanggal_lahir');   // DATE
$table->dateTime('jadwal');      // DATETIME
$table->timestamps();            // created_at + updated_at DATETIME
$table->softDeletes();           // deleted_at DATETIME NULLABLE
$table->enum('status', ['aktif', 'nonaktif']); // ENUM
$table->json('metadata');        // JSON
$table->foreignId('user_id')->constrained(); // FK ke tabel users

5. Modifier Kolom

$table->string('email')->unique();       // nilai unik
$table->string('gambar')->nullable();    // boleh NULL
$table->integer('urutan')->default(0);  // nilai default
$table->string('kode')->index();         // tambah index
$table->after('nama');                  // posisi kolom (saat modify)

6. Menjalankan Migration

# Jalankan semua migration yang belum dijalankan
php artisan migrate

# Rollback migration terakhir
php artisan migrate:rollback

# Rollback sebanyak N step
php artisan migrate:rollback --step=3

# Reset semua dan jalankan ulang dari awal
php artisan migrate:fresh

# Reset + jalankan seeder sekaligus
php artisan migrate:fresh --seed

# Lihat status migration
php artisan migrate:status

7. Migration untuk Modifikasi Tabel

// Tambah kolom baru
public function up(): void
{
    Schema::table('artikels', function (Blueprint $table) {
        $table->string('meta_title')->nullable()->after('judul');
        $table->text('meta_description')->nullable()->after('meta_title');
    });
}

public function down(): void
{
    Schema::table('artikels', function (Blueprint $table) {
        $table->dropColumn(['meta_title', 'meta_description']);
    });
}

8. Ringkasan

  • Migration adalah version control untuk database - perubahan tabel dicatat dalam file PHP
  • Buat migration dengan php artisan make:migration nama_migration
  • Method up() untuk membuat, down() untuk rollback
  • Jalankan dengan php artisan migrate, rollback dengan php artisan migrate:rollback

Tutorial berikutnya membahas seeder dan factory di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.