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 $fillable untuk keamanan mass assignment
  • find(), findOrFail(), where()->get() untuk mengambil data
  • create(), save(), update(), delete() untuk manipulasi data
  • Scope membuat query yang reusable dan mudah dibaca

Tutorial berikutnya membahas CRUD sederhana dengan Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.