laravel eloquent relationship | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: laravel eloquent relationship

Saturday, April 11, 2026

laravel eloquent relationship

#Laravel #EloquentORM #PHP #Tutorial
Seri Belajar Laravel Lengkap · Artikel 15 dari 50

Eloquent Relationships:
One to Many, Many to Many,
dan Lainnya

Kuasai cara menghubungkan tabel-tabel di database Laravel dengan cara yang elegan — tanpa pusing JOIN query manual yang bikin sakit kepala.

⏱️
Estimasi Baca
12 Menit
🎯
Level
Pemula → Menengah
📅
Update
2025

Pernah nggak sih kamu nulis query SQL panjang banget — penuh JOIN sana-sini — cuma buat ngambil data yang sebetulnya simple? Kalau iya, kamu pasti tahu betapa menyiksanya itu. Nah, di sinilah Eloquent Relationships hadir bak pahlawan bertopeng. Dengan fitur ini dalam migration Laravel, kamu bisa mendefinisikan hubungan antar tabel cuma dalam beberapa baris kode yang bersih dan mudah dibaca.

Di artikel ke-15 dari seri 50 Artikel Belajar Laravel ini, kita akan kupas tuntas semua jenis relasi Eloquent — mulai dari yang paling dasar hingga yang bikin developer senior kagum. Siap-siap, karena setelah membaca ini cara kamu memandang struktur database bakal berubah selamanya.

📐 Definisi Kunci

Eloquent Relationships adalah fitur ORM (Object-Relational Mapping) di Laravel yang memungkinkan kamu mendefinisikan hubungan antar tabel database langsung di dalam Model PHP. Dengan ini, query relasi bisa ditulis semudah $user->posts — tanpa SQL manual!

🔗 Relasi One to One dan One to Many di Laravel

Bayangkan kamu punya satu buah kunci dan satu gembok. Hanya kunci itu yang bisa membuka gembok itu — itulah analogi One to One. Sekarang bayangkan satu ibu punya beberapa anak — itulah One to Many. Konsep ini langsung berlaku di tabel database kamu yang dibuat lewat migration Laravel.

💡
TIPS: Naming Convention Foreign Key

Laravel secara otomatis menebak nama foreign key berdasarkan nama model. Jika Model kamu bernama User, Eloquent akan cari kolom user_id secara otomatis. Patuhi konvensi ini di migration Laravel dan hidupmu akan jauh lebih mudah!

Mari kita lihat cara mendefinisikannya dengan langkah yang terstruktur:

1

Buat Migration untuk Tabel posts

Jalankan perintah artisan untuk membuat file migration Laravel baru.

bash · terminal
php artisan make:migration create_posts_table
php artisan make:migration create_comments_table
2

Definisikan Foreign Key di File Migration

Edit file migration yang baru dibuat, tambahkan kolom user_id sebagai foreign key.

PHP · database/migrations/create_posts_table.php
// Migration Laravel untuk tabel posts
public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}
3

Tambahkan Method Relasi di Model

Buka app/Models/User.php dan definisikan relasi hasMany.

PHP · app/Models/User.php
class User extends Model
{
    // One User hasMany Posts (Satu user, banyak artikel)
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);
    }
}

// Di Post.php — arah sebaliknya (belongs to)
class Post extends Model
{
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

// Cara penggunaannya — semudah ini!
$posts = User::find(1)->posts;      // semua post user 1
$author = Post::find(5)->user;    // pemilik post 5
🔥
FAKTA MENARIK: foreignId() vs unsignedBigInteger()

Di Laravel 7+, method foreignId('user_id')->constrained() adalah cara modern yang otomatis membuat kolom unsigned big integer DAN foreign key constraint sekaligus. Kamu nggak perlu lagi nulis dua baris terpisah seperti versi lama!

🔀 Many to Many: Relasi Paling Kompleks di Eloquent

Sekarang yang agak lebih menantang. Bayangkan sebuah artikel bisa punya banyak tag, dan satu tag bisa ada di banyak artikel. Ini adalah relasi Many to Many. Di dunia nyata: mahasiswa bisa ikut banyak mata kuliah, dan satu mata kuliah bisa diikuti banyak mahasiswa.

Untuk ini, kita butuh tabel pivot — yaitu tabel penghubung yang menyimpan kombinasi ID dari kedua tabel utama.

PHP · Migration Laravel — Tabel Pivot post_tag
// Buat migration untuk pivot table
// php artisan make:migration create_post_tag_table

Schema::create('post_tag', function (Blueprint $table) {
    $table->foreignId('post_id')->constrained()->onDelete('cascade');
    $table->foreignId('tag_id')->constrained()->onDelete('cascade');
    $table->primary(['post_id', 'tag_id']); // composite primary key
});

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

// Cara pakai — simpel dan elegan
$post = Post::find(1);
$tags = $post->tags;            // ambil semua tag
$post->tags()->attach(3);      // tambah tag id 3
$post->tags()->detach(3);      // hapus tag id 3
$post->tags()->sync([1, 2, 4]); // set ulang tags jadi [1,2,4]
INSIGHT: Nama Pivot Table Itu Ada Rumusnya!

Laravel mengharapkan nama pivot table dalam format singular, alphabetical, underscore-separated. Contoh: relasi antara Post dan Tag → pivot table-nya adalah post_tag (bukan tag_post!). P sebelum T secara alfabetis. Kalau nama custom, bisa override di parameter kedua belongsToMany().

🚀 Has Many Through dan Polymorphic: Relasi Tingkat Lanjut

Has Many Through adalah seperti kamu mau tahu "negara mana yang punya banyak artikel?" padahal hubungannya adalah negara → user → artikel. Kamu melewati tabel user sebagai jembatan!

Polymorphic lebih keren lagi — satu model bisa berelasi dengan banyak model berbeda. Contoh: fitur komentar yang bisa ada di artikel dan di video sekaligus, tanpa perlu dua tabel komentar terpisah.

PHP · Has Many Through + Polymorphic
// ── HAS MANY THROUGH ──────────────────────────
// Country → User → Post (melalui user)
class Country extends Model
{
    public function posts(): HasManyThrough
    {
        return $this->hasManyThrough(Post::class, User::class);
    }
}

// ── POLYMORPHIC ───────────────────────────────
// Migration Laravel untuk tabel comments (polimorfik)
Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->text('body');
    $table->morphs('commentable'); // buat kolom commentable_id + commentable_type
    $table->timestamps();
});

// Model Post dan Video bisa punya comments
class Post extends Model
{
    public function comments(): MorphMany
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

// Mengambil semua komentar dari post
$post->comments;  // 🎉 langsung bisa dipakai!
⚠️
PERHATIAN: Jalankan Migration Setelah Perubahan!

Setiap kali kamu mengubah file migration Laravel, jangan lupa jalankan php artisan migrate. Untuk development, gunakan php artisan migrate:fresh --seed untuk reset dan isi ulang database dari awal.

🔍

Analisis: Kapan Pakai Relasi Apa?

Jenis Relasi Method Laravel Contoh Kasus Butuh Pivot?
One to One hasOne / belongsTo User → Profile ❌ Tidak
One to Many hasMany / belongsTo User → Posts ❌ Tidak
Many to Many belongsToMany Post ↔ Tag ✅ Ya
Has Many Through hasManyThrough Country → Posts via User ❌ Tidak
Polymorphic morphMany / morphTo Comment → Post/Video ❌ Tidak

✅ Best Practices Migration Laravel untuk Relasi Eloquent

Mengetahui sintaks saja belum cukup. Berikut beberapa praktik terbaik yang membedakan kode junior dari kode senior saat bekerja dengan migration Laravel dan Eloquent Relationships:

🗑️

Selalu Tambahkan onDelete()

Tentukan perilaku saat data induk dihapus. Gunakan 'cascade' untuk hapus otomatis, atau 'restrict' untuk mencegah penghapusan.

📝

Return Type di Method

Selalu tambahkan return type declaration (: HasMany) di method relasi. Ini membuat IDE bisa memberikan autocomplete yang akurat!

Pakai Eager Loading

Gunakan with() saat query relasi di loop. Artikel berikutnya akan bahas N+1 problem yang bisa bikin aplikasi kamu lemot!

💡
TIPS: Cek Relasi dengan Tinker

Mau test relasi tanpa nulis controller dulu? Jalankan php artisan tinker lalu ketik langsung di terminal: User::find(1)->posts. Hasilnya langsung muncul di terminal — debugging tercepat yang ada!

🎉

Kesimpulan

Di artikel ini kita telah menjelajahi seluruh ekosistem Eloquent Relationships di Laravel.

🔗
One to One & One to Many
hasOne, hasMany, belongsTo
🔀
Many to Many
belongsToMany + pivot table
🚀
Advanced Relations
hasManyThrough, morphMany

Dengan memahami migration Laravel dan cara mendefinisikan relasi di Model, kamu sudah satu langkah lebih dekat menjadi Laravel developer yang handal. Artikel ke-16 kita akan bahas topik kritis yang sering diabaikan pemula: Eager Loading vs Lazy Loading — jangan sampai lewat!

Tags:

#Laravel #EloquentORM #PHP #MigrationLaravel #BelajarLaravel #DatabaseRelations

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux