BAB 26: Model dan Migration

Membuat model Eloquent dan file migrasi untuk entitas utama aplikasi studi kasus.

Koneksi database sudah terbukti berjalan — migrasi default Laravel berhasil membuat tabelnya. Sekarang giliran kita mendefinisikan tabel utama aplikasi: tabel catatan.

Membuat Model dan Migration Sekaligus

Artisan menyediakan shortcut untuk membuat model sekaligus file migrasnya dalam satu perintah. Jalankan dari dalam direktori proyek:

php artisan make:model Catatan -m

Flag -m meminta Artisan untuk membuat file migrasi bersamaan dengan model. Dua file baru akan muncul:

   INFO  Model [app/Models/Catatan.php] created successfully.

   INFO  Migration [database/migrations/2026_03_17_xxxxxx_create_catatans_table.php] created successfully.

Perhatikan nama file migrasi yang dihasilkan: create_catatans_table — dengan huruf s di akhir. Laravel secara otomatis membuat nama tabel dalam bentuk plural bahasa Inggris dari nama model. Model Catatan menjadi tabel catatans. Ini perlu kita koreksi.

Mengisi Migration

Buka file migrasi yang baru dibuat di database/migrations/. Ubah nama tabel dari catatans menjadi catatan, lalu isi kolom-kolomnya:

// database/migrations/xxxx_xx_xx_xxxxxx_create_catatans_table.php
<?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('catatan', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
            $table->string('judul');
            $table->text('isi')->nullable();
            $table->enum('prioritas', ['rendah', 'sedang', 'tinggi'])->default('sedang');
            $table->boolean('selesai')->default(false);
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('catatan');
    }
};

Penjelasan setiap kolom:

  • id() — primary key auto-increment
  • foreignId('user_id')->nullable()->constrained()->nullOnDelete() — foreign key ke tabel users, boleh NULL; saat user dihapus, kolom ini diset NULL alih-alih menghapus catatan
  • string('judul') — judul catatan, maksimal 255 karakter
  • text('isi')->nullable() — isi catatan, boleh kosong
  • enum('prioritas', ...) — nilai prioritas dibatasi hanya tiga pilihan valid
  • boolean('selesai')->default(false) — status penyelesaian, default belum selesai
  • timestamps() — otomatis menambahkan created_at dan updated_at

Mengkonfigurasi Model

Buka app/Models/Catatan.php yang baru dibuat. File aslinya hampir kosong — hanya berisi class kosong yang extends Model. Tambahkan properti yang diperlukan:

// app/Models/Catatan.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Catatan extends Model
{
    protected $table = 'catatan';

    protected $fillable = [
        'user_id',
        'judul',
        'isi',
        'prioritas',
        'selesai',
    ];

    protected function casts(): array
    {
        return [
            'selesai' => 'boolean',
        ];
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

$table = 'catatan' memberitahu Eloquent nama tabel yang digunakan. Tanpa ini, Laravel mencari tabel catatans — yang tidak ada karena kita sudah mengganti namanya di migration.

$fillable mendaftarkan kolom yang boleh diisi secara massal melalui Catatan::create(). Ini perlindungan dari mass assignment vulnerability yang sudah dibahas di BAB 19.

Cast 'selesai' => 'boolean' memastikan nilai kolom selalu dikembalikan sebagai true/false — bukan 1/0 seperti yang tersimpan di database.

Relasi user() menghubungkan catatan ke pemiliknya melalui user_id, menggunakan pola belongsTo yang sudah dibahas di BAB 20.

Model dan migration sudah siap. Langkah selanjutnya adalah menjalankan migration untuk benar-benar membuat tabel catatan di database.

Referensi

  1. 1Generating Migrations — Laravel 12.x Documentation
  2. 2Table Names — Eloquent: Getting Started