Eloquent: CRUD & Query
Membuat, membaca, mengubah, dan menghapus data; filter, urutan, paginasi, agregat, updateOrCreate.
Membuat data (Create)
$produk = new Produk();
$produk->nama = 'Kopi Arabika';
$produk->harga = 85000;
$produk->save();
$produk = Produk::create([ // mass assignment (butuh #[Fillable])
'kategori_id' => 1,
'nama' => 'Kopi Arabika',
'slug' => 'kopi-arabika',
'harga' => 85000,
]);
Membaca (Read)
Produk::all(); // SEMUA baris (hati-hati pada tabel besar)
Produk::find(1); // by id → model atau null
Produk::findOrFail(1); // 404 otomatis bila tidak ada
Produk::where('slug', 'kopi-arabika')->first();
Produk::firstWhere('slug', 'kopi-arabika');
Produk::where('stok', '>', 0)
->where('aktif', true)
->orderByDesc('created_at')
->limit(20)
->get(); // Collection model
Query dibangun dengan rantai method (query builder) dan baru dijalankan saat memanggil get(), first(), paginate(), count(), dst.
Filter yang sering dipakai
->where('harga', '>=', 50000)
->whereIn('kategori_id', [1, 2, 3])
->whereBetween('harga', [10000, 50000])
->whereNull('deskripsi')
->where('nama', 'like', "%{$kata}%")
->orWhere('slug', $kata)
->where(function ($q) use ($kata) { // pengelompokan kondisi
$q->where('nama', 'like', "%{$kata}%")->orWhere('deskripsi', 'like', "%{$kata}%");
})
->when($request->filled('kategori'), fn ($q) => $q->where('kategori_id', $request->kategori))
Urutan, paginasi, agregat
->orderBy('nama') ->orderByDesc('harga') ->latest() ->oldest()
->paginate(10); // objek paginator + tautan halaman ({{ $produk->links() }})
->simplePaginate(10); // lebih ringan (hanya prev/next)
Produk::count(); Produk::sum('stok'); Produk::avg('harga'); Produk::max('harga'); Produk::min('harga');
Produk::where('aktif', true)->exists();
Mengubah (Update)
$produk = Produk::findOrFail($id);
$produk->update(['harga' => 90000]); // mass assignment
$produk->harga = 90000; $produk->save(); // atau satu per satu
Produk::where('stok', 0)->update(['aktif' => false]); // update massal (tidak memicu event model)
Create atau update sekaligus
Produk::firstOrCreate(['slug' => 'kopi-arabika'], ['nama' => 'Kopi Arabika', 'harga' => 85000]);
Produk::updateOrCreate(['slug' => 'kopi-arabika'], ['harga' => 90000]); // ada → update, tidak → buat
Produk::upsert($baris, ['slug'], ['harga']); // massal & efisien (uniqueBy wajib diisi di Laravel 13)
Menghapus (Delete)
$produk->delete();
Produk::destroy([1, 2, 3]);
Produk::where('aktif', false)->delete();
Collection & chunk
get() mengembalikan Collection dengan banyak method fungsional: map, filter, pluck('nama'), sum('harga'), groupBy, sortBy. Untuk memproses jutaan baris tanpa menghabiskan memori: Produk::chunk(500, fn ($grup) => ...) atau cursor().
Melihat SQL
Produk::where(...)->toSql() atau ->dd() / ->dump() membantu belajar SQL apa yang dihasilkan.
Query Builder tanpa model
use Illuminate\Support\Facades\DB;
DB::table('produks')->where('stok', '>', 0)->get();
DB::transaction(function () { /* semua berhasil atau semua batal */ });