Migration di Laravel: Panduan Lengkap dengan Contoh Kode
Setiap developer Laravel pasti sudah kenal migration. Tapi banyak yang belum tahu fitur-fitur migration yang lebih dalam: cara rollback aman, modifikasi kolom tanpa data hilang, atau cara buat index yang tepat.
Artikel ini membahas migration di Laravel dari dasar sampai teknik yang dipakai di proyek production.
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.
Keuntungannya: semua developer di tim punya struktur database yang sama, dan perubahan terlacak di git.
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.
Struktur Migration
Migration punya dua method: up() untuk apply, down() untuk rollback.
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
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
// Relasi
$table->foreignId('user_id')->constrained(); // FK ke tabel users
$table->foreignId('category_id')
->nullable()
->constrained()
->nullOnDelete();
Modifikasi Kolom yang Sudah Ada
Gunakan change() untuk modifikasi kolom tanpa hapus tabel:
public function up(): void
{
Schema::table('articles', function (Blueprint $table) {
// Perluas panjang kolom
$table->string('title', 500)->change();
// Jadikan nullable
$table->text('summary')->nullable()->change();
// Tambah kolom baru
$table->string('meta_title')->nullable()->after('title');
// Hapus kolom
$table->dropColumn('old_field');
// Rename kolom
$table->renameColumn('body', 'content');
});
}
public function down(): void
{
Schema::table('articles', function (Blueprint $table) {
$table->string('title', 255)->change();
$table->dropColumn('meta_title');
$table->renameColumn('content', 'body');
});
}
Index untuk Performa Query
Index yang tepat bisa membuat query jauh lebih cepat:
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->string('status');
$table->timestamp('ordered_at');
$table->timestamps();
// Index tunggal
$table->index('status');
// Composite index — sangat berguna untuk filter gabungan
$table->index(['user_id', 'status']);
$table->index(['status', 'ordered_at']);
// Unique constraint
$table->unique(['user_id', 'order_number']);
});
Kapan tambah index: Kolom yang sering dipakai di
WHERE,ORDER BY, atauJOIN. Jangan tambah index di semua kolom. Terlalu banyak index justru memperlambat operasi insert/update.
Menjalankan Migration
# Jalankan migration yang belum dijalankan
php artisan migrate
# Lihat status migration
php artisan migrate:status
# Rollback migration terakhir
php artisan migrate:rollback
# Rollback beberapa batch
php artisan migrate:rollback --step=3
# Reset semua migration
php artisan migrate:reset
# Drop semua tabel lalu migrate ulang (pakai di development)
php artisan migrate:fresh --seed
Migration di Production: Aturan Aman
Beberapa hal yang penting saat deploy migration ke production:
- Jangan hapus kolom langsung: kalau kode masih pakai kolom tersebut, bisa error. Deprecate dulu, hapus di deploy berikutnya.
- Tambah kolom nullable atau dengan default: kolom NOT NULL tanpa default di tabel besar bisa lock tabel saat migration berjalan.
- Test rollback sebelum deploy — pastikan method
down()bisa dijalankan tanpa error. - Backup dulu — sebelum migration yang modifikasi struktur tabel penting.
Baca Juga
- Membuat Controller di Laravel 12: Resource, API, dan Best Practice
- Tutorial PostgreSQL di Laravel: Setup dan Fitur yang Berguna
Kalau Anda butuh tim untuk bangun aplikasi Laravel dari awal sampai production, lihat layanan pengembangan aplikasi kami.
Ingin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel