Menguasai Eloquent ORM Laravel: membuat model dengan make:model -m, mass assignment $fillable/$guarded, query Model::all/find/create, Query Builder where/orderBy/paginate, serta perbandingan Eloquent versus raw SQL dan kapan memakai yang mana.

Setelah tampilan siap di episode 6, sekarang kita urus jantung data aplikasi: Eloquent ORM — Active Record ORM bawaan Laravel yang menghubungkan model PHP dengan tabel database. Di episode ini kita pelajari cara membuat model, aturan mass assignment, dan query dasar yang dipakai hampir di setiap aplikasi.
Eloquent adalah pembeda terbesar Laravel vs framework PHP lain. Memahaminya secara benar — bukan sekadar menghafal method — akan membuat kalian menulis kode database yang aman dan cepat.
Satu perintah bisa membuat model + migration + factory sekaligus:
php artisan make:model Post -m -fFile yang dihasilkan:
app/Models/Post.php — model Eloquent.database/migrations/xxxx_create_posts_table.php — migration tabel posts.database/factories/PostFactory.php — factory untuk data dummy (episode 8).<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'slug', 'body'];
}Convention over configuration: model Post otomatis terhubung ke tabel posts, primary key id, kolom timestamp created_at/updated_at. Kalian tidak perlu menuliskan apa-apa untuk itu.
Laravel melindungi kalian dari mass assignment vulnerability — serangan yang menyisipkan kolom berbahaya (misalnya is_admin) lewat form. Dua cara mengizinkan mass assignment:
class Post extends Model
{
// 1. Whitelist: hanya kolom ini yang boleh di-mass assign
protected $fillable = ['title', 'slug', 'body'];
// 2. Blacklist: semua kolom boleh, kecuali yang tercantum
// protected $guarded = ['is_admin'];
}Post::create([
'title' => 'Post Pertama',
'slug' => 'post-pertama',
'body' => 'Isi post...',
]);Warning
Jangan pernah menempatkan kolom sensitif di $fillable. Jika sebuah form mengirim is_admin=1 dan kolom itu ada di $fillable, user bisa mengubah statusnya sendiri. Biasakan whitelist ($fillable) yang eksplisit, atau $guarded = ['*'] bila butuh akses penuh di luar input user.
$all = Post::all(); // semua record
$first = Post::find(1); // by primary key
$new = Post::create([...]); // insert + return instance
$post = Post::findOrFail(42); // 404 jika tidak ada
$count = Post::count(); // jumlah recordfindOrFail adalah pola favorit untuk controller: ia melempar ModelNotFoundException yang diubah Laravel menjadi response 404 — pasangan sempurna dengan route model binding di episode 5.
Query Builder adalah lapisan di bawah Eloquent yang beroperasi pada tabel, bukan model. Bisa dipakai langsung:
$drafts = DB::table('posts')
->where('status', 'draft')
->orderBy('created_at', 'desc')
->limit(10)
->get();Lebih umum, Query Builder dipakai di dalam Eloquent — Eloquent adalah superset-nya:
$published = Post::query()
->where('status', 'published')
->whereDate('created_at', '>', now()->subDays(7))
->orderByDesc('created_at')
->paginate(10);paginate(10) adalah fitur yang sangat bernilai: ia membungkus query dengan LIMIT/OFFSET dan menghasilkan koleksi LengthAwarePaginator yang langsung bisa dirender di Blade:
@foreach ($published as $post)
<p>{{ $post->title }}</p>
@endforeach
{{ $published->links() }}$published->links() merender tautan halaman 1-2-3 dengan satu baris.
| Aspek | Eloquent | Raw SQL (DB::select) |
|---|---|---|
| Readability | Ekspresif, mirip kalimat | SQL mentah, perlu parsing manual |
| Keamanan | Binding otomatis (anti SQL injection) | Perlu binding manual (?) |
| Relasi & mutator | Bawaan | Harus manual |
| Query kompleks | Bisa dipaksa, kadang janggal | Bebas penuh |
| Performa | Sedikit overhead | Paling cepat |
Prinsip praktis: mulai dengan Eloquent; turun ke raw SQL hanya untuk query kompleks atau sangat hot-path (misalnya laporan agregat dengan window functions). Selalu gunakan parameter binding, jangan interpolasi string.
$users = DB::select('SELECT * FROM users WHERE email = ?', [$email]);Inti yang harus dibawa pulang:
make:model -m -f membuat model, migration, dan factory sekaligus.$fillable untuk kolom yang boleh diisi user.all/find/findOrFail/create, lalu where/orderByDesc/paginate.paginate() + links() memberi pagination hampir tanpa usaha.Di episode 8 selanjutnya kita akan membahas migrations, seeder & factory — Schema builder untuk struktur tabel dan constraint, php artisan migrate, db:seed dengan Model Factories, serta eksplorasi data via php artisan tinker. Sampai jumpa di episode 8!