Home Paket Belajar Bootcamp Instruktur

Kuasai Eloquent ORM #5 - Mengenal Polymorphic Relations

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 10 kali

Rating: 5.00 ⭐

... 08 June 2026, 19:34

Apa itu Polymorphic?

Polymorphic memungkinkan satu model berelasi dengan berbagai model berbeda menggunakan satu set kolom.

Contoh: Comment bisa dimiliki oleh Post maupun Video.

posts       videos      comments
id          id          id
title       title       body
                        commentable_id    ← ID dari post/video
                        commentable_type  ← Nama class: App\Models\Post

Migrasi

Schema::create('comments', function (Blueprint $table) {
    $table->id();
    $table->text('body');
    $table->unsignedBigInteger('commentable_id');
    $table->string('commentable_type');
    $table->timestamps();

    // Buat index untuk performa
    $table->index(['commentable_id', 'commentable_type']);
});

Definisi Relasi

Model Comment:

class Comment extends Model
{
    public function commentable(): \Illuminate\Database\Eloquent\Relations\MorphTo
    {
        return $this->morphTo();
    }
}

Model Post:

class Post extends Model
{
    public function comments(): \Illuminate\Database\Eloquent\Relations\MorphMany
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

Model Video:

class Video extends Model
{
    public function comments(): \Illuminate\Database\Eloquent\Relations\MorphMany
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

Penggunaan

// Tambah comment ke post
$post = Post::find(1);
$post->comments()->create(['body' => 'Artikel yang bagus!']);

// Tambah comment ke video
$video = Video::find(1);
$video->comments()->create(['body' => 'Video informatif!']);

// Ambil semua comment dari post
$comments = $post->comments;

// Akses parent dari comment (bisa Post atau Video)
$comment = Comment::find(1);
$parent  = $comment->commentable; // Mengembalikan Post atau Video
echo get_class($parent); // App\Models\Post

Many-to-Many Polymorphic: morphToMany

Contoh: Tag bisa menempel di Post dan Video sekaligus.

taggables (pivot)
  tag_id
  taggable_id
  taggable_type
class Tag extends Model
{
    public function posts(): MorphToMany
    {
        return $this->morphedByMany(Post::class, 'taggable');
    }

    public function videos(): MorphToMany
    {
        return $this->morphedByMany(Video::class, 'taggable');
    }
}

class Post extends Model
{
    public function tags(): MorphToMany
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

Ringkasan Episode 5

Relasi Digunakan di
morphTo() Child model (Comment)
morphMany() Parent model (Post, Video) — One-to-Many
morphOne() Parent model — One-to-One
morphToMany() Parent model — Many-to-Many
morphedByMany() Tag model — Many-to-Many balik

Daftar eBook