Eloquent menyediakan ratusan method, tetapi pekerjaan sehari-hari sebenarnya berputar pada puluhan method inti yang sama. Chapter ini mengumpulkan method-method tersebut menjadi kartu contekan per kelompok: pengambilan data, penyaringan, agregasi, penyimpanan, hingga operasi relationship. Konsep di balik tiap kelompok sudah dibahas tuntas di section Eloquent ORM dan Eloquent Relationships , jadi di sini kita fokus pada bentuk singkatnya yang siap dilirik cepat.
Satu hal yang perlu diingat saat membaca kartu ini: hampir semua method penyaringan dan pengurutan mengembalikan query builder, bukan hasil. Query baru benar-benar dieksekusi saat kita memanggil method penutup seperti get(), first(), count(), atau paginate(). Karena itu method-method tersebut bisa dirantai sebebasnya — Tugas::where('status', 'todo')->latest()->limit(5)->get() — tanpa mengeksekusi satu pun query di tengah rantai. Pemahaman pola ini menjelaskan sekaligus perbedaan Tugas::find(1) (langsung query) dan Tugas::where(...) (menunggu get()).
Pengambilan Data #
| Method | Mengembalikan | Catatan |
|---|---|---|
all() | Collection seluruh baris | Tanpa filter; hindari di tabel besar |
find($id) | Model atau null | Menerima array untuk banyak ID |
findOrFail($id) | Model atau 404 | Idiom wajib di controller show |
first() | Baris pertama hasil query atau null | Gabungan where + limit |
firstWhere('kolom', $nilai) | Baris pertama yang cocok | Versi ringkas where(...)->first() |
value('kolom') | Nilai satu kolom baris pertama | Tanpa memuat model penuh |
pluck('kolom') | Collection nilai satu kolom | pluck('nama', 'id') set kunci |
chunk(100, fn) | Potongan 100 baris | Hemat memori untuk tabel besar |
lazy() | LazyCollection | Alternatif modern chunk |
Penyaringan, Urutan, dan Batas #
| Method | Contoh singkat | Padanan Course |
|---|---|---|
where / orWhere | where('status', 'todo') | Membaca Data |
whereIn / whereNotIn | whereIn('id', [1, 2]) | — |
whereBetween | whereBetween('harga', [100, 500]) | — |
whereNull / whereNotNull | whereNull('deleted_at') | — |
whereDate / whereMonth | whereDate('created_at', '2026-01-01') | — |
orderBy / orderByDesc | orderByDesc('created_at') | — |
latest / oldest | latest('updated_at') | — |
inRandomOrder | acak untuk sampling | — |
limit / offset | limit(10)->offset(20) | — |
Dengan agregasi, satu baris lagi lengkap: count(), sum('kolom'), avg('kolom'), min('kolom'), max('kolom'), serta exists() dan doesntExist() — dua-duanya mengembalikan boolean tanpa memuat baris. Untuk hasil berhalaman, paginate(15) dan simplePaginate(15) sudah dibahas di Pagination
.
Penyimpanan dan Penghapusan #
| Method | Perilaku | Kapan dipakai |
|---|---|---|
create([...]) | Buat baris dalam satu panggilan | Wajib $fillable |
$m->fill([...]); $m->save() | Isi lalu simpan model di memori | Perlu ID model sebelum simpan |
update([...]) (query) | Massal di semua baris cocok | Tanpa event model |
$m->update([...]) | Simpan perubahan satu model | Memicu event |
firstOrCreate([...]) | Cari; buat bila tak ada | Data acuan/reference |
updateOrCreate([...], [...]) | Update; buat bila tak ada | Upsert satu baris |
increment / decrement | Naik/turunkan kolom numerik | Counter tanpa race |
delete() / destroy($id) | Hapus model / baris by ID | — |
forceDelete() | Hapus permanen model soft delete | Soft Deletes |
Mari kita lihat beberapa method tersebut bekerja dalam satu sesi nyata pada tabel tugas berisi tiga baris. Kode berikut dijalankan di sandbox Course ini:
echo Tugas::count() . PHP_EOL; // 3
echo Tugas::firstWhere('status', 'done')->judul . PHP_EOL;
echo Tugas::where('status', 'todo')->value('judul') . PHP_EOL;
echo Tugas::pluck('judul')->implode(', ') . PHP_EOL;
Tugas::updateOrCreate(
['judul' => 'Belajar Laravel'], // kunci pencarian
['status' => 'done'], // nilai yang diperbarui
);
echo Tugas::where('status', 'todo')->count() . PHP_EOL;Output yang Dihasilkan:
3
Kirim laporan
Belajar Laravel
Belajar Laravel, Kirim laporan, Review kode
1Perhatikan dua baris terakhir: updateOrCreate menemukan baris “Belajar Laravel” lalu mengubah statusnya menjadi done, sehingga jumlah baris berstatus todo turun dari dua menjadi satu. Pasangannya firstOrCreate tidak akan mengubah baris yang ditemukan — method ini hanya membuat baris baru bila pencarian kosong, ideal untuk data acuan seperti kategori. Detail per step-nya dibedah di Memperbarui Data
dan Membuat Data
.
Definisi Relationship #
Semua relasi didefinisikan sebagai method di model, dan konvensi penamaan Laravel membuat kita jarang menulis foreign key secara manual: method komentar() di model Post otomatis diasumsikan memakai kolom post_id di tabel komentar. Konvensi ini bisa diganti dengan argumen kedua dan ketiga bila skema database kita memakai nama lain — pembahasan lengkapnya di One to Many
dan Many to Many
.
| Method | Relasi | Contoh |
|---|---|---|
hasOne | One-to-one | return $this->hasOne(Profil::class) |
hasMany | One-to-many | return $this->hasMany(Komentar::class) |
belongsTo | Inverse one-to-many | return $this->belongsTo(User::class) |
belongsToMany | Many-to-many | return $this->belongsToMany(Tag::class) |
morphMany / morphOne | Polymorphic | return $this->morphMany(Komentar::class, 'komentarable') |
morphTo | Inverse polymorphic | return $this->morphTo() |
Operasi Relationship #
| Method | Relasi target | Efek |
|---|---|---|
$post->comments()->save($komentar) | hasMany | Simpan model + isi foreign key |
$post->comments()->createMany([...]) | hasMany | Buat banyak baris terkait |
$komentar->post()->associate($post) | belongsTo | Set FK tanpa query |
$komentar->post()->dissociate() | belongsTo | Nol-kan FK |
$post->tags()->attach([1, 2]) | belongsToMany | Tambah baris pivot |
$post->tags()->detach([1]) | belongsToMany | Hapus baris pivot |
$post->tags()->sync([1, 2, 3]) | belongsToMany | Samakan pivot persis |
$post->tags()->toggle([2]) | belongsToMany | Hidupkan/matikan |
Seluruh operasi ini dibahas dengan data lengkap di Relationship Operations .
Scope dan Eager Loading #
Dua senjata penata query yang menutup kartu ini. Local scope merangkum filter yang sering dipakai: definisikan method scopeBulanIni($query) di model, lalu panggil Tugas::bulanIni()->get() — detailnya di Query Scopes
. Adapun with('relasi') memuat relasi di muka untuk mencegah masalah N+1, withCount('relasi') menambahkan kolom hitungan, dan has('relasi') menyaring model yang punya relasi — ketiganya dibedah di Eager Loading
dan Mencegah N+1
.
Model mengurus data; lapisan berikutnya yang menampilkannya adalah template. Kartu contekan untuk lapisan itu tersedia di Referensi Blade , dan satu tingkat lebih ke belakang — lapisan yang mengantarkan request sampai ke controller — dirangkum di Referensi Routing .