M
Mr Sugiarto
Developer
29 Aug 2026 2 min read

Tabel sudah ada di database, tapi kalau mau query data, kita butuh cara yang lebih ekspresif daripada SQL mentah. Di sinilah Eloquent, ORM (Object-Relational Mapping) bawaan Laravel, berperan — setiap tabel direpresentasikan sebagai class PHP yang disebut model.

Screenshot: Mengakses relasi Post ↔ Category langsung lewat Tinker. Mengakses relasi PostCategory langsung lewat Tinker.

Generate model

php artisan make:model Category
php artisan make:model Post

Secara default, Eloquent menebak nama tabel dari nama model secara otomatis: model Post → tabel posts, model Category → tabel categories. Konvensi ini artinya kita jarang perlu menulis nama tabel secara manual.

Model Category

class Category extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'slug'];

    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}

Dua bagian penting:

  • $fillable — daftar kolom yang boleh diisi lewat mass assignment (Category::create([...])). Ini proteksi keamanan supaya kolom sensitif tidak bisa diisi sembarangan lewat input user.
  • posts() — method relasi. hasMany(Post::class) artinya satu kategori punya banyak post.

Model Post

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['category_id', 'title', 'slug', 'body', 'thumbnail'];

    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }
}

belongsTo(Category::class) adalah kebalikan dari hasMany — satu post dimiliki oleh satu kategori. Relasi ini otomatis dipetakan lewat kolom category_id yang sudah kita buat di migration episode sebelumnya.

Mencoba lewat Tinker

Tinker adalah REPL bawaan Laravel — cara tercepat untuk eksperimen kode tanpa perlu bikin route atau controller dulu.

php artisan tinker
$category = App\Models\Category::create(['name' => 'Tutorial', 'slug' => 'tutorial']);
$post = App\Models\Post::create([
    'category_id' => $category->id,
    'title' => 'Hello World',
    'slug' => 'hello-world',
    'body' => 'Test body',
]);

echo $post->category->name; // "Tutorial"
echo $category->posts()->count(); // 1

Perhatikan $post->category->name — cukup akses relasi seperti properti biasa, Eloquent otomatis menjalankan query JOIN di belakang layar untuk mengambil kategori terkait.

Kenapa ini terasa "ajaib"

Dibanding menulis SQL manual:

SELECT categories.name FROM posts
JOIN categories ON posts.category_id = categories.id
WHERE posts.id = 1;

Eloquent membiarkan kita menulis $post->category->name — jauh lebih mudah dibaca dan tetap type-safe berkat return type BelongsTo dan HasMany di method relasi.

Selanjutnya

Sekarang kita punya dua cara untuk query database: Query Builder (DB::table()) dan Eloquent (Post::query()). Episode berikutnya kita bandingkan langsung keduanya.

M
Mr Sugiarto

Developer

Bagian dari Series: Laravel 13 Dasar — Belajar Fundamental Lewat Blog Sederhana
Lihat Series Lengkap