Laravel

Panduan Lengkap Eloquent ORM di Laravel

06 Jun 2026 Administrator
Header Hero

Panduan Lengkap Eloquent ORM di Laravel

Arsitektur ActiveRecord, Operasi CRUD, Relasi Model Database, serta Transformasi Data

Dalam arsitektur pengembangan web modern, interaksi langsung dengan database menggunakan query SQL mentah (*raw SQL queries*) sering kali memicu tumpukan kode yang kaku dan sulit dipelihara. Framework Laravel mengatasi tantangan ini dengan menyediakan komponen pemetaan objek-relasional bawaan yang sangat elegan, yaitu Eloquent ORM. Menggunakan implementasi pola *ActiveRecord*, Eloquent memperlakukan setiap tabel di database Anda sebagai sebuah objek kelas PHP tunggal yang disebut **Model**.

Dengan Eloquent ORM, Anda dapat melakukan manipulasi data, menyusun relasi antar tabel yang kompleks, hingga menerapkan filter keamanan tanpa perlu menyentuh sintaksis SQL secara manual. Abstraksi tingkat tinggi ini memastikan kode program aplikasi Anda tetap bersih, terstruktur, dan memiliki portabilitas database yang tinggi—baik saat berjalan di atas MySQL, PostgreSQL, maupun SQLite. Panduan komprehensif ini akan membedah siklus kerja Eloquent ORM mulai dari operasi CRUD dasar, manajemen relasi, hingga fitur kustomisasi tingkat lanjut.

Konvensi Naming Otomatis: Secara default, Laravel akan mengasumsikan nama tabel Anda berformat jamak (*plural*) dalam Bahasa Inggris dari nama Modelnya (misal: Model User berpasangan dengan tabel users, Model Post berpasangan dengan tabel posts).

1. Pembuatan dan Struktur Dasar Model

Gunakan CLI Artisan untuk membuat file model baru. Anda juga dapat menambahkan flag khusus untuk membuat file migrasi, factory, seeder, atau controller sekaligus:

# Membuat model dasar
php artisan make:model Post

# Membuat model lengkap dengan file Migration, Factory, Seeder, dan Controller API sekaligus
php artisan make:model Post -mfs --api

Buka file model di app/Models/Post.php. Berikut adalah contoh penyesuaian properti kustom di dalam model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Post extends Model
{
    use HasFactory;

    // Properti opsional jika nama tabel tidak mengikuti konvensi jamak laravel
    protected $table = 'my_posts';

    // Properti opsional jika primary key bukan kolom 'id'
    protected $primaryKey = 'post_id';

    // Mendaftarkan kolom mana saja yang diizinkan untuk manipulasi data massal (Mass Assignment)
    protected $fillable = ['title', 'content', 'slug', 'is_published'];
}

2. Eksekusi Operasi CRUD Berlapis

A. Create (Menyimpan Data Baru)

// Metode Instansiasi Objek
$post = new Post();
$post->title = 'Belajar Eloquent';
$post->content = 'Isi konten tutorial.';
$post->save();

// Metode Mass Assignment (Pastikan sudah mengisi properti $fillable di model)
$post = Post::create([
    'title' => 'Belajar Laravel',
    'content' => 'Panduan praktis backend development.',
]);

// Update atau Create jika data sudah eksis berdasarkan kriteria kunci
$user = User::updateOrCreate(
    ['email' => '[email protected]'],
    ['name' => 'Surya Febri Alwari']
);

B. Read (Membaca & Memfilter Data)

// Mengambil semua data tabel
$posts = Post::all();

// Mencari berdasarkan Primary Key atau lempar error 404 jika nihil
$post = Post::findOrFail(5);

// Kueri kondisional berantai (Query Chaining)
$activePosts = Post::where('is_published', true)
                   ->where('views_count', '>', 100)
                   ->orderBy('created_at', 'desc')
                   ->take(10)
                   ->get();

// Memeriksa eksistensi data
$exists = Post::where('slug', 'tutorial-v2ray')->exists();

C. Update & Delete (Memperbarui & Menghapus Data)

// UPDATE: Cari data lalu perbarui array properti
$post = Post::find(1);
$post->update(['title' => 'Judul Baru Terupdate']);

// Increment nilai kolom numerik otomatis
$post->increment('views_count', 1);

// DELETE: Hapus data tunggal
$post = Post::find(1);
$post->delete();

// Mass Delete berdasarkan kondisi
Post::where('is_published', false)->delete();

3. Manajemen Relasi Model (Relationships)

Definisikan hubungan antar tabel secara deklaratif menggunakan metode relasi Eloquent di dalam class Model:

One To Many

Relasi Satu ke Banyak (Satu User memiliki banyak Post)

// Di dalam Model User.php
public function posts()
{
    return $this->hasMany(Post::class);
}

// Di dalam Model Post.php (Kebalikan/Inverse Relasi)
public function user()
{
    return $this->belongsTo(User::class);
}

// Contoh Pemanggilan Data Relasi di Controller
$user = User::find(1);
$userPosts = $user->posts; // Otomatis mengambil koleksi data post milik user ini

// Teknik Eager Loading untuk menghindari masalah kueri berlebih (N+1 Query Problem)
$postsWithUsers = Post::with('user')->get();
Many To Many

Relasi Banyak ke Banyak (Post memiliki banyak Tag, Tag memiliki banyak Post)

// Di dalam Model Post.php
public function tags()
{
    return $this->belongsToMany(Tag::class);
}

// Sinkronisasi data tabel pivot perantara secara dinamis
$post = Post::find(1);

// Menambahkan relasi ID tag tanpa menghapus relasi yang lama
$post->tags()->attach([1, 2]);

// Sinkronisasi otomatis (Hanya menyisakan ID di dalam array pada tabel relasi, sangat aman!)
$post->tags()->sync([2, 3, 4]);

4. Kontrol Transformasi Data & Pemetaan Kueri

A. Accessors & Mutators (Transformasi Data Otomatis)

Gunakan metode penulisan mutakhir Laravel untuk merekayasa nilai atribut saat disimpan ke database atau diambil dari database:

// Di dalam Model User.php
use Illuminate\Database\Eloquent\Casts\Attribute;

// MUTATOR: Otomatis mengubah string email menjadi huruf kecil kecil saat diinput
protected function email(): Attribute
{
    return Attribute::make(
        set: fn (string $value) => strtolower($value),
    );
}

// ACCESSOR: Membuat adatbasa atribut bayangan baru virtual gabungan nama depan & belakang
protected function fullName(): Attribute
{
    return Attribute::make(
        get: fn () => "{$this->first_name} {$this->last_name}",
    );
}

B. Local Scopes (Penyederhanaan Blok Kueri Berulang)

Bungkus kueri filter yang sering Anda panggil ke dalam sebuah *Local Scope* agar skrip kode di controller lebih bersih dan modular:

// Di dalam Model Post.php
// Wajib gunakan awalan nama prefiks 'scope'
public function scopePublished($query)
{
    return $query->where('is_published', true);
}

// Pemanggilan berantai bersih di Controller Anda
$posts = Post::published()->orderBy('created_at', 'desc')->get();
Praktik Terbaik Optimasi Kinerja Eloquent ORM

Ikuti standarisasi baku berikut untuk menjamin keandalan dan kecepatan kueri aplikasi Anda pada tingkat skala enterprise:

  • Hindari N+1 Query Problem: Saat memanggil koleksi data yang memuat relasi model anak, pastikan Anda selalu menggunakan metode with() (*Eager Loading*) untuk mengonsolidasikan kueri database menjadi seminimal mungkin.
  • Gunakan Chunking Untuk Dataset Masif: Jika Anda memproses ribuan baris data Eloquent secara berkala, jangan gunakan perintah Post::all() karena akan menghabiskan batas alokasi memori RAM server. Gunakan metode Post::chunk(100, function($posts) { ... }) untuk memproses data secara bertahap.
  • Batasi Kolom Menggunakan `select()`: Untuk efisiensi penggunaan memori, batasi pengambilan kolom tabel yang tidak diperlukan (misalnya kolom konten teks panjang) dengan memanggil fungsi penentu kolom spesifik: Post::select('id', 'title', 'slug')->get().
  • Manfaatkan Model Caching: Gunakan caching internal pada kueri statis yang jarang berubah untuk memotong beban akses langsung (*database hits*) ke dalam media penyimpanan server VPS Anda.
v