Migration: Version Control untuk Database
Kelola skema database dengan migration: buat tabel, ubah kolom, dan rollback dengan aman.
Migration itu apa?
Migration adalah file PHP yang mendeskripsikan perubahan skema database. Seperti Git untuk database: setiap perubahan tercatat, bisa dijalankan maju (migrate) atau mundur (rollback), dan seluruh tim mendapat skema yang sama.
Buat migration baru:
php artisan make:migration create_posts_tableFile dibuat di database/migrations/ dengan prefix timestamp supaya urutannya jelas.
Menulis skema dengan Blueprint
// database/migrations/xxxx_create_posts_table.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('posts', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('judul');
$table->string('slug')->unique();
$table->text('isi');
$table->enum('status', ['draft', 'published'])->default('draft');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};Tipe kolom yang sering dipakai: string (varchar 255), text, integer, boolean, date, datetime, decimal, json. Method timestamps() membuat kolom created_at dan updated_at otomatis. Method foreignId()->constrained() membuat foreign key ke tabel users mengikuti konvensi.
Mengubah tabel yang sudah ada
php artisan make:migration add_cover_to_posts_table --table=postspublic function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->string('cover')->nullable()->after('slug');
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('cover');
});
}Perintah yang wajib hafal
php artisan migrate # jalankan migration yang belum jalan
php artisan migrate:rollback # batalkan batch terakhir
php artisan migrate:refresh # rollback semua lalu migrate ulang
php artisan migrate:fresh # drop semua tabel lalu migrate ulangCatatan teknis: Jangan pernah mengedit migration yang sudah di-push dan dijalankan di server production. Buat migration baru untuk setiap perubahan. Mengedit migration lama bikin database tiap environment tidak sinkron dan migrasi bisa gagal total.