Relasi Eloquent Laravel 13.x: hasMany, belongsTo, dan Eager Loading

5 Oktober 2026 · 5 menit baca

Artikel ini dibuat secara otomatis dengan bantuan AI dan telah ditinjau oleh Arya Anjar Ginantara.

Editorial cover for Relasi Eloquent Laravel 13.x: hasMany, belongsTo, dan Eager Loading.

Sebuah post dapat memiliki banyak komentar, sedangkan setiap komentar hanya mengacu ke satu post. Struktur datanya sederhana. Yang sering membingungkan justru cara menerjemahkannya ke Eloquent: kapan memakai hasMany, di sisi mana belongsTo diletakkan, dan mengapa kadang relasi ditulis sebagai method tetapi diakses seperti property.

Eloquent adalah object-relational mapper atau ORM bawaan Laravel. Sederhananya, ORM menghubungkan model PHP dengan record pada tabel database. Dokumentasi Eloquent Laravel 13.x menjelaskan bahwa setiap tabel memiliki model yang dipakai untuk berinteraksi dengan tabel tersebut. Relasi menambahkan cara bagi satu model untuk menjangkau model lain yang terhubung.

Mulai dari hubungan datanya, bukan sintaks

Sebelum menulis method, nyatakan hubungan dalam bahasa biasa:

  • satu Post dapat memiliki banyak Comment;
  • satu Comment dimiliki oleh satu Post.

Dua kalimat itu menghasilkan dua arah relasi. Pada model induk, Post memakai hasMany. Pada model anak, Comment memakai belongsTo. Arah kedua bukan duplikasi. Ia memungkinkan kode bergerak dari post ke kumpulan komentar maupun dari komentar kembali ke post pemiliknya.

Schema database harus mendukung hubungan tersebut. Berdasarkan konvensi yang didokumentasikan Laravel, relasi Comment ke Post akan mencari foreign key post_id pada tabel komentar. Jika proyek memakai nama kolom atau key yang berbeda, definisi relasinya perlu menyebutkan key tersebut secara eksplisit. Jangan mengandalkan konvensi sebelum memeriksa migration dan schema proyek Anda.

Contoh konseptual: Post dan Comment

Contoh berikut mengikuti dokumentasi Laravel 13.x. Kode ini bersifat ilustratif dan belum dijalankan pada aplikasi atau database lokal.

Definisikan arah satu-ke-banyak pada model Post terlebih dahulu:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Post extends Model
{
    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class);
    }
}

Method comments() mendefinisikan relasi. Karena method relasi juga dapat bertindak sebagai query builder, kode dapat menambahkan kondisi sebelum mengambil record.

Lalu definisikan arah kebalikannya pada model Comment:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Comment extends Model
{
    public function post(): BelongsTo
    {
        return $this->belongsTo(Post::class);
    }
}

Sekarang model menyatakan dua hal yang berbeda: Post::comments() mengarah ke sekumpulan komentar, sedangkan Comment::post() mengarah ke satu post induknya. Contoh sengaja berhenti pada pemodelan dan pengambilan data. Ia tidak mencakup controller, route, API resource, autentikasi, otorisasi, atau penyimpanan CRUD lengkap.

Method untuk membentuk query, property untuk membaca hasil relasi

Setelah relasi tersedia, bentuk pemanggilannya menyampaikan maksud yang berbeda.

Gunakan method ketika Anda masih ingin membentuk query relasi:

$post = Post::findOrFail(1);

$comments = $post->comments()
    ->where('is_approved', true)
    ->get();

Contoh memakai findOrFail(1) sebagai keputusan eksplisit: alur hanya diteruskan jika post ditemukan; jika tidak, Laravel melempar ModelNotFoundException. comments() mengembalikan objek relasi yang dapat dilanjutkan dengan kondisi query. Kolom is_approved pada contoh hanyalah asumsi domain; pastikan kolom dan nilainya memang ada pada schema proyek.

Gunakan dynamic property ketika Anda ingin membaca hasil relasi sebagai data terkait:

$post = Post::findOrFail(1);

foreach ($post->comments as $comment) {
    // Gunakan data komentar yang sudah dimuat oleh Eloquent.
}

Menurut dokumentasi relasi Eloquent Laravel 13.x, akses property seperti $post->comments memuat relasi ketika property itu pertama kali diakses. Perilaku ini nyaman untuk satu objek, tetapi perlu keputusan yang lebih sengaja ketika kode mengambil banyak post lalu membutuhkan komentar setiap post.

Pilih eager loading ketika relasi memang dibutuhkan bersama data induk

Jika halaman atau proses akan menampilkan sekumpulan post beserta komentarnya, nyatakan relasi yang diperlukan sebelum menjalankan pengambilan data induk:

$posts = Post::with('comments')->get();

foreach ($posts as $post) {
    foreach ($post->comments as $comment) {
        // Tampilkan atau olah komentar.
    }
}

Laravel menyebut pola ini eager loading. Dengan with('comments'), Eloquent meminta relasi sebagai bagian dari pengambilan model induk; pada contoh ini, proses database terjadi ketika get() dijalankan. Ini berbeda dari lazy loading, yang baru memuat relasi ketika property tersebut pertama kali diakses. Dokumentasi menjelaskan eager loading sebagai alat untuk mengurangi pola query N+1.

Namun, with('comments') bukan aturan yang harus dipasang pada setiap query. Muat relasi yang memang dipakai oleh alur tersebut. Relasi yang besar, kolom yang dipilih, batas hasil, urutan, dan kebutuhan filter tetap harus ditentukan dari halaman atau proses yang sebenarnya. Periksa query log dan perilaku aplikasi lokal sebelum menyimpulkan dampaknya.

Jika kebutuhan data relasi juga mempunyai kondisi, Laravel mendokumentasikan constrained eager loading. Gunakan hanya setelah kondisi dan bentuk hasilnya jelas; artikel ini tidak memperluas contoh menjadi referensi seluruh variasi eager loading.

Kapan modelnya bukan hasMany dan belongsTo?

Contoh Post dan Comment cocok untuk satu-ke-banyak karena satu komentar memiliki satu post induk. Dua bentuk lain perlu keputusan berbeda:

  • Many-to-many berlaku ketika record di kedua sisi dapat terhubung ke banyak record pada sisi lain. Dokumentasi Laravel memberi contoh pengguna dan role: satu pengguna dapat memiliki banyak role, dan satu role dapat dimiliki banyak pengguna. Hubungan ini memerlukan intermediate table dan layak dibahas sebagai model tersendiri.
  • Polymorphic relationship memungkinkan model anak terkait ke lebih dari satu jenis model melalui satu asosiasi. Contohnya, komentar dapat dimiliki post maupun video. Fleksibilitas ini menambah keputusan schema dan tipe model, sehingga jangan memilihnya hanya untuk menghindari dua relasi biasa.

Gunakan tipe relasi yang menggambarkan aturan domain saat ini. Jangan mengubah satu-ke-banyak menjadi many-to-many atau polymorphic hanya karena bentuk tersebut tersedia di framework.

Keputusan praktis

Untuk memodelkan data terkait dengan Eloquent, mulai dari kalimat domain: berapa banyak record di sisi A yang dapat terhubung ke sisi B, dan di sisi mana foreign key disimpan. Dari sana, definisikan method relasi pada kedua arah yang benar. Pakai method seperti comments() ketika Anda perlu menambahkan kondisi query, dan pakai property seperti comments ketika Anda ingin membaca data relasinya.

Pilih eager loading saat banyak model induk memang akan digunakan bersama relasinya dalam alur yang sama. Untuk satu objek atau relasi yang belum tentu dibutuhkan, lazy loading dapat tetap masuk akal. Yang harus divalidasi pada proyek Anda adalah nama foreign key, tipe key, data kosong, jumlah data, filter, query aktual, dan kebutuhan indeks. Dokumentasi memberi API-nya; schema dan pola akses aplikasi menentukan pilihan yang tepat.

Bagikan:XLinkedIn

Artikel terkait