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-incrementforeignId('user_id')->nullable()->constrained()->nullOnDelete()— foreign key ke tabelusers, bolehNULL; saat user dihapus, kolom ini disetNULLalih-alih menghapus catatanstring('judul')— judul catatan, maksimal 255 karaktertext('isi')->nullable()— isi catatan, boleh kosongenum('prioritas', ...)— nilai prioritas dibatasi hanya tiga pilihan validboolean('selesai')->default(false)— status penyelesaian, default belum selesaitimestamps()— otomatis menambahkancreated_atdanupdated_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.