Hari ini saya masuk ke materi yang paling saya tunggu-tunggu sejak mulai belajar Laravel: Eloquent ORM. Setelah di episode kemarin saya belajar migration untuk membangun struktur tabel, kali ini saya mulai berkenalan dengan cara Laravel “berbicara” dengan database — dan jujur, ini momen di mana Laravel terasa benar-benar berbeda dari cara saya menulis SQL manual dulu.
Dulu: SQL di tangan, sekarang: objek di tangan
Waktu saya masih ngoding PHP tanpa framework, query database selalu berbentuk teks: INSERT INTO todos, SELECT * FROM todos, dan seterusnya. Setiap operasi saya harus menulis string SQL, memastikan sintaksnya benar, lalu memetakan hasilnya ke array secara manual. Rajin sih, tapi banyak bagian yang berulang dan rawan salah ketik.
Eloquent mengubah pendekatan itu. Alih-alih menulis SQL, saya bekerja dengan objek PHP. Satu baris di tabel = satu objek model. Satu tabel = satu class model. Inilah yang disebut ORM (Object-Relational Mapping): jembatan yang memetakan baris database menjadi objek di kode.

Model: class kecil yang tahu nama tabelnya
Membuat model di Laravel hanya butuh satu perintah Artisan:
php artisan make:model Todo
File app/Models/Todo.php yang dihasilkan sangat sederhana:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Todo extends Model
{
//
}
Yang menarik bagi saya: class ini kosong, tapi sudah langsung bisa dipakai. Laravel memakai konvensi penamaan — model Todo secara otomatis terhubung ke tabel todos (jamak dari nama class), dengan primary key id. Konvensi ini yang membuat kode tetap rapi tanpa harus deklarasi ulang di setiap class.
CRUD dengan gaya baru
Berikut yang saya catat sebagai pola dasar CRUD lewat Eloquent:
// CREATE
$todo = Todo::create([
'title' => 'Belajar Eloquent ORM',
'completed' => false,
]);
// READ
$semuaTodo = Todo::all(); // semua baris
$satuTodo = Todo::find(1); // cari by primary key
// UPDATE
$todo->completed = true;
$todo->save();
// DELETE
$todo->delete();
Beberapa hal yang saya pelajari dari contoh di atas:
create()butuh data dalam bentuk array asosiatif; kolom lain yang tidak diisi memakai nilai default dari migration.find()mengembalikan satu objek model, ataunullkalau id-nya tidak ada.- Untuk update, saya ubah property objeknya lalu panggil
save()— pola ini terasa natural seperti mengedit variabel biasa. - Kolom
created_atdanupdated_atdiisi otomatis oleh Eloquent (lewat timestamps), jadi saya tidak perlu menuliskannya manual.
Yang baru saya sadari (dan sempat bikin bingung)
Hal yang sempat membuat saya tersendat: Todo::create() menolak data kalau field-nya tidak terdaftar di property $fillable. Ini proteksi mass assignment — mencegah user melempar kolom tersembunyi lewat form (misalnya menaikkan role jadi admin). Jadi saya perlu menambahkan:
class Todo extends Model
{
protected $fillable = ['title', 'completed'];
}
Awalnya saya mengira ini merepotkan, tapi setelah dipahami justru membuat saya lebih disiplin: setiap field yang boleh diisi user dicatat eksplisit, sisanya tertutup. Kebalikan dari $fillable adalah $guarded, dan salah satu dari keduanya biasanya dideklarasikan di model.
Contoh paling gampang yang saya bayangkan: Todo::all() itu seperti “saya minta semua baris tabel todos, dan Laravel mengembalikannya sebagai kumpulan objek Todo yang bisa saya loop satu per satu”. Hasilnya bukan array asosiatif polos seperti kebiasaan lama saya, melainkan koleksi objek — dan dari situ saya bisa memanggil method pada tiap objek, misalnya mengecek $todo->completed atau memanggil relasi yang nanti akan saya pelajari.
Satu tips yang saya dapatkan dari dokumentasi: kalau ragu kolom mana yang diisi otomatis, saya bisa cek model Todo di tinker dengan menulis Todo::first() lalu melihat atributnya. php artisan tinker menjadi “teman ngobrol” saya untuk mencoba query tanpa menulis controller dulu — sangat menolong saat masih tahap mengenal Eloquent seperti sekarang.
Kenapa ini penting buat saya
Buat saya, Eloquent adalah titik di mana Laravel mulai “mengerti” database tanpa saya harus menulis SQL di setiap controller. Kode jadi lebih pendek, lebih mudah dibaca, dan risiko typo SQL berkurang drastis. Ini bukan berarti SQL tidak perlu dipelajari — pemahaman query tetap penting — tapi untuk kebutuhan CRUD harian, Eloquent sangat menghemat waktu.
Di episode berikutnya saya akan lanjut ke relasi antar-tabel (hasOne, hasMany, belongsTo) — di situlah Eloquent benar-benar menunjukkan kekuatannya. Sampai ketemu!
Komentar Terbaru