Belajar Laravel #6: Eloquent ORM Dasar — Berbicara dengan Database Lewat Objek PHP

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.

Ilustrasi relasi model Eloquent dengan tabel database dan operasi CRUD
Diagram yang saya buat untuk mengingat: Model = tabel, satu baris = satu objek

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, atau null kalau id-nya tidak ada.
  • Untuk update, saya ubah property objeknya lalu panggil save() — pola ini terasa natural seperti mengedit variabel biasa.
  • Kolom created_at dan updated_at diisi 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!

Sumber

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses