Laravel sebenarnya punya dua lapisan untuk mengakses database: Query Builder (DB::table()) yang lebih rendah level, dan Eloquent (Post::query()) yang dibangun di atasnya. Episode ini kita bandingkan langsung supaya perbedaannya konkret, bukan cuma teori.
Response JSON dari endpoint demo Eloquent — instance model lengkap dengan relasi.
Route demo
use App\Models\Post;
use Illuminate\Support\Facades\DB;
// Query Builder - works directly with the table, returns plain stdClass objects
Route::get('/demo/query-builder', function () {
return DB::table('posts')->orderBy('created_at', 'desc')->get();
});
// Eloquent - works through the Post model, returns Post model instances
Route::get('/demo/eloquent', function () {
return Post::orderBy('created_at', 'desc')->get();
});
Dua route ini menghasilkan data yang sama persis dari sisi isi, tapi tipe object yang dikembalikan berbeda.
Perbedaan mendasar
| Query Builder | Eloquent | |
|---|---|---|
| Cara akses | DB::table('posts') |
Post::query() |
| Hasil query | stdClass (object generic) |
Instance model Post |
| Relasi | Harus JOIN manual | $post->category otomatis |
| Mass assignment protection | Tidak ada | Ada ($fillable) |
| Overhead | Lebih ringan | Sedikit lebih berat (hydration model) |
| Cocok untuk | Query kompleks, laporan, agregasi berat | Operasi CRUD sehari-hari, butuh relasi |
Contoh konkret bedanya
Dengan Query Builder, kalau kita mau tahu nama kategori sebuah post, kita harus JOIN manual:
DB::table('posts')
->join('categories', 'posts.category_id', '=', 'categories.id')
->select('posts.title', 'categories.name as category_name')
->get();
Dengan Eloquent, cukup:
Post::with('category')->get()->each(function ($post) {
echo $post->title . ' - ' . $post->category->name;
});
with('category') disebut eager loading — Eloquent mengambil semua kategori terkait dalam satu query tambahan (bukan satu-satu per post), menghindari masalah klasik "N+1 query".
Kapan pilih yang mana?
Sebagai aturan praktis:
- Pakai Eloquent untuk hampir semua kasus sehari-hari: CRUD, form, halaman yang menampilkan data dengan relasinya. Kode lebih ekspresif dan mudah dibaca.
- Pakai Query Builder kalau kamu butuh performa maksimal untuk query yang sangat kompleks (laporan agregasi besar, subquery rumit) di mana overhead hydration model Eloquent jadi terasa, atau saat kamu memang tidak butuh fitur model sama sekali.
Faktanya, Eloquent sendiri dibangun di atas Query Builder — jadi keduanya bukan dua sistem terpisah, melainkan dua lapisan abstraksi dari mesin yang sama.
Testing
curl http://laravel13-blog-dasar.test/demo/query-builder
curl http://laravel13-blog-dasar.test/demo/eloquent
Bandingkan struktur JSON dari kedua response — dari sisi data sama, tapi kalau kamu tambahkan ->with('category') cuma versi Eloquent yang bisa langsung include relasi tanpa JOIN eksplisit.
Selanjutnya
Kita sudah bisa insert data manual lewat Tinker, tapi itu tidak scalable untuk testing. Episode berikutnya kita pakai factory dan seeder untuk generate data dummy secara otomatis dan realistis.