Deep Dive: Migration & Eloquent Model
Modul 02
"Merancang Skema Database dengan Elegan"
Seringkali pemula bingung membedakan antara Migration dan Model karena keduanya berurusan dengan database. Sederhananya: Migration yang membuat mejanya, Model yang menaruh dan mengambil barang di atas meja tersebut.
# Komparasi: Migration vs Model
| Aspek | Database Migration | Eloquent Model |
|---|---|---|
| Fungsi Utama | Mendefinisikan struktur tabel (kolom, tipe data, relasi, index). Berfungsi sebagai *version control* DB. | Mewakili data di dalam tabel. Digunakan untuk proses CRUD (Create, Read, Update, Delete) berbasis OOP. |
| Lokasi Folder | database/migrations/ | app/Models/ |
| Analogi | Blueprint / cetak biru arsitektur rumah. | Remote control untuk mengatur isi rumah. |
| Command Buat | php artisan make:migration | php artisan make:model |
LAB: Mendesain Skema Database
01 Generate Skema Serentak
Gunakan flag -m (*migration*) saat membuat model agar
file model dan file migration dibuat bersamaan. Ini adalah best practice yang
menghemat waktu.
php artisan make:model Article -m
02 Konfigurasi Tipe Data & Modifiers (Migration)
Buka file migration yang baru terbuat di database/migrations.
Di sini kita menentukan struktur tabel secara spesifik beserta modifiers-nya
(seperti nullable, unique, atau default).
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id(); // Primary key (BigInt Auto Increment)
$table->string('title')->unique(); // String (Varchar 255), tidak boleh kembar
$table->string('slug'); // Untuk URL ramah SEO
$table->text('content'); // Text panjang tanpa limit varchar
$table->string('image')->nullable(); // Boleh kosong (NULL)
$table->enum('status', ['draft', 'published'])->default('draft'); // Pilihan pasti
$table->foreignId('user_id')->constrained()->cascadeOnDelete(); // Relasi ke tabel users
$table->timestamps(); // otomatis membuat create_at & updated_at
});
}
03 Eksekusi & Rollback Database
Untuk mendorong perubahan struktur ini ke dalam MySQL Anda, jalankan
migrate. Jika Anda melakukan kesalahan (misal lupa menambahkan kolom), Anda
bisa melakukan rollback atau mereset total dengan perintah fresh.
# Eksekusi migrasi yang belum dijalankan
php artisan migrate
# Mengembalikan 1 step migrasi terakhir (Membongkar tabel)
php artisan migrate:rollback
# HAPUS SEMUA TABEL, lalu jalankan ulang migrasi dari awal
# (Hati-hati, data akan hilang! Hanya untuk masa development)
php artisan migrate:fresh
04 Mass Assignment di Model ($fillable vs $guarded)
Buka app/Models/Article.php.
Secara default, Laravel memblokir Mass Assignment demi keamanan (mencegah
*hacker* menyuntikkan data ke kolom sembarangan seperti is_admin). Kita
harus mendefinisikannya secara eksplisit.
Opsi 1: Menggunakan $fillable (Whitelist)
Hanya kolom di dalam array ini yang boleh diisi.
class Article extends Model
{
// Hanya kolom ini yang aman
protected $fillable = [
'title',
'slug',
'content',
'image',
'status',
'user_id'
];
}
Opsi 2: Menggunakan $guarded (Blacklist)
Semua kolom boleh diisi KECUALI yang di array ini.
class Article extends Model
{
// Cegah 'id' agar tidak di-hack,
// sisanya boleh diisi.
protected $guarded = [
'id'
];
}
Laravel memiliki konvensi penamaan yang kuat agar sistem otomatis berjalan:
- Model: Singular, PascalCase (Contoh:
Article) - Tabel Database: Plural, snake_case (Contoh:
articles)
Jika Anda memiliki tabel
database lama yang penamaannya tidak sesuai konvensi (misal tabelnya bernama
tb_artikel_data), Anda bisa menimpanya di dalam Model dengan menambahkan:
protected $table = 'tb_artikel_data';