Relasi Eloquent

Menghubungkan model: hasMany, belongsTo, belongsToMany, hasOne, dan mengakses data terkait.

Part 12 dari 26 ± 45 menit Gratis

Data saling berhubungan

Dalam aplikasi nyata tabel saling terkait: satu kategori punya banyak produk; satu produk punya banyak tag, dan satu tag dipakai banyak produk. Eloquent mendeskripsikan hubungan ini sebagai method relasi di model, sehingga kamu bisa menulis $produk->kategori->nama tanpa menulis JOIN.

Jenis relasi umum

RelasiContohMethodKolom
One to OneUser ↔ ProfilhasOne / belongsToprofils.user_id
One to ManyKategori → banyak ProdukhasMany / belongsToproduks.kategori_id
Many to ManyProduk ↔ TagbelongsToManytabel pivot produk_tag
Has Many ThroughNegara → Pengguna → PesananhasManyThrough
PolymorphicKomentar pada Post atau VideomorphMany / morphTocommentable_id/type

One to Many

// Kategori.php  — sisi "satu"
public function produks(): HasMany
{
    return $this->hasMany(Produk::class);          // mencari produks.kategori_id
}

// Produk.php  — sisi "banyak" (pemilik foreign key)
public function kategori(): BelongsTo
{
    return $this->belongsTo(Kategori::class);      // memakai kolom kategori_id
}
$kategori->produks;                   // Collection produk (properti dinamis)
$kategori->produks()->where('stok', '>', 0)->get();   // method + query tambahan
$produk->kategori->nama;              // model Kategori
$kategori->produks()->create([...]);   // buat produk milik kategori ini (kategori_id terisi otomatis)

Beda properti ($produk->kategori, langsung hasil) dengan method ($produk->kategori(), mengembalikan query builder relasi yang bisa dirantai).

Many to Many

Butuh tabel penghubung (pivot). Konvensi nama: kedua nama tabel tunggal, urut alfabet: produk_tag, dengan kolom produk_id dan tag_id.

// Produk.php
public function tags(): BelongsToMany
{
    return $this->belongsToMany(Tag::class);
}
// Tag.php
public function produks(): BelongsToMany
{
    return $this->belongsToMany(Produk::class);
}
$produk->tags()->attach([1, 2]);              // tambah relasi
$produk->tags()->detach(1);                   // lepas
$produk->tags()->sync([2, 3, 4]);             // jadikan PERSIS ini (menambah/menghapus seperlunya)
$produk->tags()->toggle([5]);                 // ada → lepas, tidak ada → pasang

Mendefinisikan return type

Biasakan menambahkan return type (HasMany, BelongsTo, BelongsToMany) dengan use Illuminate\Database\Eloquent\Relations\... agar IDE dan pembaca kode paham.

Query berdasarkan relasi

Produk::has('tags')->get();                                // punya minimal satu tag
Produk::whereHas('kategori', fn ($q) => $q->where('nama', 'Minuman'))->get();
Kategori::withCount('produks')->get();                      // tambah kolom produks_count
Produk::doesntHave('tags')->get();

Foreign key dan konvensi

Laravel menebak nama kolom dari nama model + _id. Jika berbeda, sebutkan: belongsTo(Kategori::class, 'id_kategori'). Dan pastikan migration punya foreignId(...)->constrained() agar integritas data terjaga.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X