Eloquent adalah ORM bawaan Laravel: cara membaca dan menulis tabel database lewat object PHP, tanpa menulis SQL sendiri. Tiap tabel punya satu model, sebuah class di folder app/Models. Model Book mengurus tabel books, dan tiap baris di tabel itu jadi satu object Book. Bayangin pustakawan di meja depan. Kamu cukup bilang "ambilkan buku nomor 1" atau "catat buku baru ini", dia yang masuk ke gudang dan mengisi kartu katalognya. Eloquent adalah pustakawan itu: kamu menulis Book::find(1), dia yang menyusun SQL-nya, mengirimnya, lalu menyerahkan hasilnya sebagai object.
🧪 Tebakan cepat: tabel
bookscuma berisi id 1, 2, dan 3.Book::find(9)menghasilkan apa: error,null, atau objectBookyang kosong? Tebak dulu, jawabannya ada di bagian "Membaca: all() dan find()".
Model: satu class untuk satu tabel
Tabel books sudah dibuat di pelajaran Migrasi. Sekarang buat model-nya:
php artisan make:model Book
INFO Model [/home/budi/perpustakaan/app/Models/Book.php] created successfully.
Isi file-nya seperti ini:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
protected $fillable = ['title', 'author', 'stock', 'isbn'];
}
class Book extends Modelsudah cukup untuk menyambung ke tabel. Laravel menebak nama tabelnya dari nama model:Bookjadibooks(huruf kecil, jamak bahasa Inggris). Kalau tabelmu bernama lain, tulisprotected $table = 'buku';.$fillableadalah daftar kolom yang boleh diisi lewat array, misalnya olehcreate(). Gunanya ada di bagian "$fillable dan mass assignment".
Di Lab dan contoh di bawah, tabelnya berisi tiga buku:
| id | title | author | stock |
|---|---|---|---|
| 1 | Laskar Pelangi | Andrea Hirata | 3 |
| 2 | Bumi Manusia | Pramoedya Ananta Toer | 0 |
| 3 | Cantik Itu Luka | Eka Kurniawan | 2 |
Membaca: all() dan find()
use App\Models\Book;
$books = Book::all(); // select * from "books"
echo count($books); // 3
$book = Book::find(1); // select * from "books" where "books"."id" = 1 limit 1
echo $book->title; // Laskar Pelangi
echo $book->stock; // 3
$missing = Book::find(9); // select * from "books" where "books"."id" = 9 limit 1
var_dump($missing); // NULL
Book::all()mengambil semua baris dan mengembalikan Collection, semacam array berisi objectBookyang bisa di-foreachdan di-count().Book::find(1)mencari berdasarkan primary key (id) dan mengembalikan satu objectBook. Kolomnya dibaca seperti properti:$book->title,$book->stock.Book::find(9)tetap mengirim query, cuma gak ketemu baris. Hasilnyanull, bukan error dan bukan object kosong. Itu jawaban tebakannya.Book::findOrFail(9)melemparModelNotFoundExceptiondengan pesanNo query results for model [App\Models\Book] 9, dan Laravel menjawabnya dengan halaman 404. Pakai ini di halaman detail seperti/books/{id}.
Menyimpan: create()
$book = Book::create([
'title' => 'Ronggeng Dukuh Paruk',
'author' => 'Ahmad Tohari',
'stock' => 1,
]);
echo "Buku baru: " . $book->title; // Buku baru: Ronggeng Dukuh Paruk
echo $book->id; // 4
SQL yang dikirim Laravel:
insert into "books" ("title", "author", "stock", "updated_at", "created_at") values ('Ronggeng Dukuh Paruk', 'Ahmad Tohari', 1, '2026-10-09 09:30:00', '2026-10-09 09:30:00')
create()membuat object dan langsung menyimpannya: satuINSERT.created_atdanupdated_atdiisi Eloquent sendiri, dari kolomtimestamps()di migration.- Hasilnya object yang sudah punya
idbaru dari database, jadi$book->titledan$book->idbisa langsung dibaca. Cetak nilainya dari object itu, jangan diketik ulang.
Mengubah dan menghapus
$book = Book::find(1);
$book->update(['stock' => 2]); // satu Laskar Pelangi dipinjam
// update "books" set "stock" = 2, "updated_at" = '2026-10-09 09:31:00' where "id" = 1
$book = Book::find(3);
$book->delete();
// delete from "books" where "id" = 3
Book::destroy(2); // hapus langsung lewat id, tanpa find() dulu
update([...])mengisi kolom lalu menyimpan. Cara lain yang sama:$book->stock = 2;lalu$book->save();.- Laravel cuma mengirim kolom yang berubah, ditambah
updated_at.Book::find(2)->update(['stock' => 0])gak mengirimUPDATEsama sekali, karena stok Bumi Manusia memang sudah 0. delete()menghapus baris itu. Id-nya gak dipakai ulang: buku baru berikutnya dapat id 5, bukan 3.
BookController memakai Eloquent
Di pelajaran Controller, BookController menyimpan buku di array $books. Sekarang array itu gak dibutuhkan lagi:
use App\Models\Book;
class BookController extends Controller
{
public function index()
{
return response()->json(Book::all());
}
public function show(string $id)
{
return response()->json(Book::findOrFail($id));
}
}
- Route-nya sama persis (
/booksdan/books/{id}), cuma isi method-nya yang berubah. GET /books/9dijawab 404 olehfindOrFail(), jadi pengecekanisset(...)buatan sendiri gak perlu lagi.- Model dan Collection bisa langsung masuk
response()->json(): Laravel mengubahnya jadi JSON, termasukcreated_atdanupdated_at.
$fillable dan mass assignment
Mass assignment artinya mengisi banyak kolom sekaligus dari satu array, seperti create([...]) dan update([...]). Bahayanya: kalau kamu menulis Book::create($request->all()), pengunjung bisa menambah field di form, misalnya is_admin, dan ikut mengisi kolom yang gak kamu niatkan. $fillable adalah daftar izinnya:
| Model | Book::create([...]) |
|---|---|
tanpa $fillable |
MassAssignmentException: Add [title] to fillable property to allow mass assignment on [App\Models\Book]. Gak ada query terkirim. |
dengan $fillable |
tersimpan. Key yang gak ada di daftar, misalnya is_admin, dibuang diam-diam. |
Laravel 13 juga menerima daftar yang sama sebagai atribut di atas class, #[Fillable(['title', 'author'])]. Latihannya memakai $fillable.
⚠️ Jebakan yang sering ketemu
- Lupa
$fillable.create()langsung gagal denganMassAssignmentException. Tambahkan nama kolomnya ke$fillable. - Memakai hasil
find()tanpa cek. Kalau id-nya gak ada,$bookitunull, dan$book->titleberhenti denganAttempt to read property "title" on null. Cek dulu, atau pakaifindOrFail(). $book->update()di objectnull. HasilnyaCall to a member function update() on null. Sama: id-nya gak ketemu.- Mengetik ulang nilainya.
echo "Buku baru: Ronggeng Dukuh Paruk";mencetak teks yang sama, tapi gak membuktikan apa-apa. Baca dari object:echo "Buku baru: " . $book->title;. Latihannya memeriksa ini.
TL;DR: Model adalah class di app/Models yang mengurus satu tabel (Book untuk books), dibuat dengan php artisan make:model Book. Book::all() mengembalikan Collection semua baris, Book::find(1) satu object atau null kalau gak ada, Book::findOrFail(1) menjawab 404 kalau gak ada. Book::create([...]) mengirim satu INSERT, mengisi created_at dan updated_at, dan mengembalikan object dengan id barunya. update([...]) mengirim kolom yang berubah saja, delete() menghapus barisnya. create() dan update() cuma mengisi kolom yang ada di $fillable; tanpa $fillable sama sekali, Laravel melempar MassAssignmentException.