Eloquent Dasar — Laravel

Eloquent ORM memungkinkan kamu berinteraksi dengan database menggunakan PHP object, bukan SQL mentah. Model dasar: class User extends Model { protected…

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 books cuma berisi id 1, 2, dan 3. Book::find(9) menghasilkan apa: error, null, atau object Book yang 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'];
}

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

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')

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

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));
    }
}

$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

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.

Yang akan kamu pelajari