Home Paket Belajar Bootcamp Instruktur

Kuasai Eloquent ORM #3 - Mengenal Relasi Many-to-Many

Pelajari Eloquent ORM Laravel dari dasar hingga mahir. Pahami berbagai jenis relasi seperti hasOne, hasMany, belongsTo, belongsToMany, hasManyThrough, hingga polymorphic relationship. Kuasai teknik query yang efisien menggunakan eager loading, constraint query, aggregate, subquery, serta cara menghindari N+1 Query agar aplikasi Laravel lebih cepat dan scalable. Materi disertai studi kasus dan best practice yang sering digunakan di proyek nyata.

✅ Telah dilihat 21 kali

Rating: 5.00 ⭐

... 08 June 2026, 19:34

Konsep Many-to-Many

Contoh kasus: Post bisa punya banyak Tag, dan satu Tag bisa ada di banyak Post.

Diperlukan pivot table sebagai jembatan:

posts        post_tag (pivot)    tags
id           post_id             id
title        tag_id              name

⚠️ Nama pivot table = gabungan dua nama tabel, diurutkan alfabetis, singular: post_tag

Migrasi Pivot Table

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

Definisi Relasi

Model Post:

class Post extends Model
{
    public function tags(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Tag::class);
    }
}

Model Tag:

class Tag extends Model
{
    public function posts(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Post::class);
    }
}

Operasi Pivot

$post = Post::find(1);

// Attach: tambah relasi
$post->tags()->attach([1, 2, 3]);

// Detach: hapus relasi
$post->tags()->detach(2);

// Sync: sesuaikan relasi (hapus yang tidak ada, tambah yang baru)
$post->tags()->sync([1, 3, 5]);

// Toggle: kalau ada dihapus, kalau tidak ada ditambah
$post->tags()->toggle([2, 4]);

// Ambil semua tag dari post
$tags = $post->tags;

foreach ($tags as $tag) {
    echo $tag->name;
}

Pivot Table dengan Kolom Tambahan

Misalnya pivot menyimpan waktu role diberikan:

Schema::create('role_user', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
    $table->foreignId('role_id')->constrained();
    $table->timestamp('assigned_at')->nullable();
    $table->primary(['user_id', 'role_id']);
});
class User extends Model
{
    public function roles(): BelongsToMany
    {
        return $this->belongsToMany(Role::class)
                    ->withPivot('assigned_at')  // sertakan kolom pivot
                    ->withTimestamps();
    }
}

// Attach dengan data pivot
$user->roles()->attach($roleId, ['assigned_at' => now()]);

// Akses data pivot
foreach ($user->roles as $role) {
    echo $role->pivot->assigned_at;
}

Ringkasan Episode 3

  • Many-to-Many butuh pivot table
  • Gunakan attachdetachsynctoggle untuk kelola relasi
  • withPivot() untuk akses kolom tambahan di pivot

Daftar eBook