Tutorial Laravel #13: Eloquent ORM Dasar
1. Apa itu Eloquent ORM?
Eloquent adalah ORM (Object-Relational Mapping) bawaan Laravel. Dengan Eloquent, setiap tabel database direpresentasikan oleh sebuah Model class. Interaksi dengan database dilakukan via method pada class tersebut - jauh lebih intuitif dan ekspresif dibanding Query Builder biasa.
2. Membuat Model
# Buat model saja
php artisan make:model Artikel
# Buat model + migration sekaligus
php artisan make:model Artikel -m
# Buat model + migration + seeder + factory + controller sekaligus
php artisan make:model Artikel -msc --factory
3. Konfigurasi Model
<?php
// app/Models/Artikel.php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
use IlluminateDatabaseEloquentFactoriesHasFactory;
class Artikel extends Model
{
use HasFactory, SoftDeletes;
// Nama tabel (opsional, default: nama class diplural+snakecase = artikels)
protected $table = 'artikels';
// Kolom yang boleh diisi massal (mass assignment)
protected $fillable = [
'user_id', 'kategori_id', 'judul', 'slug',
'konten', 'gambar', 'status', 'views'
];
// Atau kebalikannya - kolom yang TIDAK boleh diisi massal
// protected $guarded = ['id'];
// Cast tipe data otomatis
protected $casts = [
'published_at' => 'datetime',
'views' => 'integer',
'metadata' => 'array',
];
}
4. CRUD dengan Eloquent
use AppModelsArtikel;
// READ - Ambil semua
$artikels = Artikel::all();
// READ - Dengan kondisi
$published = Artikel::where('status', 'published')->get();
$terbaru = Artikel::latest()->take(5)->get();
$satu = Artikel::find(1); // cari by primary key
$satu = Artikel::findOrFail(1); // 404 jika tidak ada
$satu = Artikel::where('slug', 'belajar-laravel')->first();
$satu = Artikel::firstWhere('slug', 'belajar-laravel');
// CREATE - Cara 1: new + save
$artikel = new Artikel();
$artikel->judul = 'Judul Baru';
$artikel->konten = 'Isi konten...';
$artikel->save();
// CREATE - Cara 2: create() - butuh $fillable di model
$artikel = Artikel::create([
'judul' => 'Judul Baru',
'konten' => 'Isi konten...',
'user_id' => auth()->id(),
'status' => 'draft',
]);
// UPDATE - Cara 1: find + update
$artikel = Artikel::findOrFail(1);
$artikel->judul = 'Judul Diubah';
$artikel->save();
// UPDATE - Cara 2: where + update
Artikel::where('id', 1)->update(['status' => 'published']);
// DELETE - Hard delete
$artikel = Artikel::findOrFail(1);
$artikel->delete();
// DELETE - Soft delete (kolom deleted_at diisi, data tetap ada di DB)
// Butuh SoftDeletes trait dan kolom deleted_at di migration
5. Scope - Query yang Reusable
class Artikel extends Model
{
// Local scope
public function scopePublished($query)
{
return $query->where('status', 'published');
}
public function scopePopular($query, int $minViews = 1000)
{
return $query->where('views', '>=', $minViews);
}
}
// Pemakaian
$artikels = Artikel::published()->latest()->get();
$viral = Artikel::published()->popular(5000)->take(10)->get();
6. Accessor dan Mutator (Sederhana)
use IlluminateDatabaseEloquentCastsAttribute;
class Artikel extends Model
{
// Accessor - modifikasi nilai saat DIBACA
protected function judul(): Attribute
{
return Attribute::make(
get: fn ($value) => ucwords($value),
);
}
// Accessor kalkulasi (tidak disimpan di DB)
protected function ringkasan(): Attribute
{
return Attribute::make(
get: fn () => substr($this->konten, 0, 150) . '...',
);
}
}
$artikel = Artikel::find(1);
echo $artikel->judul; // huruf pertama tiap kata kapital
echo $artikel->ringkasan; // 150 karakter pertama konten
7. Ringkasan
- Eloquent merepresentasikan tabel database sebagai class Model
- Definisikan
$fillableuntuk keamanan mass assignment find(),findOrFail(),where()->get()untuk mengambil datacreate(),save(),update(),delete()untuk manipulasi data- Scope membuat query yang reusable dan mudah dibaca
Tutorial berikutnya membahas CRUD sederhana dengan Laravel.
.jpg)
