Cara Menggunakan Eloquent Relationship di Laravel (One to Many & Many to Many)

Di aplikasi nyata, data jarang berdiri sendiri: satu user punya banyak artikel, satu artikel punya banyak tag. Menangani hubungan antar-tabel ini secara manual dengan query JOIN bi...

Cara Menggunakan Eloquent Relationship di Laravel (One to Many & Many to Many)
  1. Cara Menggunakan Eloquent Relationship di Laravel (One to Many & Many to Many) โ€” Anda di sini
  2. Cara Membuat dan Menggunakan Middleware di Laravel (Contoh Cek Role)
  3. Cara Menggunakan Model Observer di Laravel

Di aplikasi nyata, data jarang berdiri sendiri: satu user punya banyak artikel, satu artikel punya banyak tag. Menangani hubungan antar-tabel ini secara manual dengan query JOIN bisa melelahkan. Eloquent Relationship di Laravel membuatnya jauh lebih ringkas dan mudah dibaca. Artikel ini membahas dua relasi yang paling sering dipakai โ€” One to Many dan Many to Many โ€” beserta cara menghindari jebakan performa yang umum.

Apa Itu Eloquent Relationship?

Eloquent adalah ORM (Object Relational Mapping) Laravel. Alih-alih menulis SQL JOIN, kamu mendefinisikan hubungan antar-model sebagai method, lalu mengaksesnya seperti properti biasa. Kode jadi lebih deklaratif dan mudah dirawat.

One to Many (Satu ke Banyak)

Contoh klasik: satu User menulis banyak Post. Di model User, tambahkan method posts():

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

Sebaliknya, satu Post dimiliki satu User. Di model Post:

// app/Models/Post.php
public function user()
{
    return $this->belongsTo(User::class);
}

Syaratnya, tabel posts punya kolom user_id (foreign key). Sekarang kamu bisa mengakses relasinya:

$user = User::find(1);

foreach ($user->posts as $post) {   // semua post milik user
    echo $post->title;
}

$post = Post::find(5);
echo $post->user->name;             // nama penulis post

Many to Many (Banyak ke Banyak)

Contoh: satu Post punya banyak Tag, dan satu Tag dipakai banyak Post. Relasi ini butuh tabel pivot (misalnya post_tag) berisi post_id dan tag_id.

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

// app/Models/Tag.php
public function posts()
{
    return $this->belongsToMany(Post::class);
}

Menambah dan melepas relasi jadi sangat mudah dengan attach, detach, dan sync:

$post->tags()->attach($tagId);        // tambah satu relasi
$post->tags()->detach($tagId);        // hapus satu relasi
$post->tags()->sync([1, 2, 3]);       // set persis jadi tag 1,2,3

Jebakan N+1 dan Eager Loading

Ini masalah performa yang paling sering menimpa pemula. Perhatikan kode ini:

$posts = Post::all();
foreach ($posts as $post) {
    echo $post->user->name;   // 1 query TAMBAHAN per post!
}

Kalau ada 100 post, Laravel menjalankan 1 query untuk post + 100 query untuk user = 101 query. Solusinya eager loading dengan with():

$posts = Post::with('user')->get();   // cukup 2 query total

Selalu pakai with() saat kamu tahu relasi akan diakses di dalam perulangan. Ini salah satu optimasi paling berdampak di aplikasi Laravel.

Pertanyaan yang Sering Diajukan (FAQ)

Kapan pakai hasMany vs belongsTo?

hasMany dipasang di model "induk" (yang memiliki banyak), belongsTo di model "anak" (yang dimiliki). Foreign key selalu ada di tabel milik model belongsTo.

Apa itu tabel pivot?

Tabel perantara pada relasi Many to Many yang menyimpan pasangan foreign key kedua tabel. Laravel menebak namanya dari gabungan dua nama model (urut alfabet), misalnya post_tag.

Bagaimana mengambil data dari tabel pivot?

Tambahkan ->withPivot('kolom') pada definisi relasi, lalu akses lewat $post->tags[0]->pivot->kolom.

Kesimpulan

Eloquent Relationship membuat pengelolaan data antar-tabel jadi jauh lebih ringkas: One to Many dengan hasMany/belongsTo, dan Many to Many dengan belongsToMany + tabel pivot. Jangan lupa gunakan with() untuk menghindari masalah N+1 yang diam-diam memperlambat aplikasi.

Ingin memahami fondasinya lebih dulu? Baca Cara Membuat Relasi Tabel di MySQL dengan Foreign Key dan Cara Membuat Migration dan Seeder di Laravel untuk menyiapkan struktur tabelnya.

eloquent relationship laravel relasi database laravel hasMany belongsTo laravel many to many laravel laravel relasi tabel
Yudhi
Ditulis oleh

Yudhi

Web Developer

Web developer yang sehari-hari berkutat dengan PHP, Laravel, JavaScript, dan MySQL. Terbiasa membangun aplikasi web dari nol โ€” merancang database, menulis fitur, memburu bug, hingga deploy ke server โ€” lalu menuangkan solusi dan tutorialnya di DhieCoderWeb agar lebih mudah diikuti developer lain.

Bagikan artikel
Kembali

Komentar (0)

Punya pertanyaan atau tambahan? Tulis di bawah โ€” tak perlu login.

Membalas komentarโ€ฆ batal

Belum ada komentar. Jadilah yang pertama!

๐Ÿš€ Partner Recommendation

Butuh Source Code & Aplikasi Premium?

Download aplikasi Laravel, POS, Sekolah, Klinik, ERP, dan source code siap pakai di GudangCode.

GudangCode
  • โœ” Source Code Premium
  • โœ” Sistem Siap Pakai
  • โœ” Lifetime Update
  • โœ” Membership Lifetime
  • โœ” Update Aplikasi Harian
Daftar Membership โ†’