Relasi Eloquent
Menghubungkan model: hasMany, belongsTo, belongsToMany, hasOne, dan mengakses data terkait.
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
| Relasi | Contoh | Method | Kolom |
|---|---|---|---|
| One to One | User ↔ Profil | hasOne / belongsTo | profils.user_id |
| One to Many | Kategori → banyak Produk | hasMany / belongsTo | produks.kategori_id |
| Many to Many | Produk ↔ Tag | belongsToMany | tabel pivot produk_tag |
| Has Many Through | Negara → Pengguna → Pesanan | hasManyThrough | |
| Polymorphic | Komentar pada Post atau Video | morphMany / morphTo | commentable_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.