Eloquent relationship polymorphic laravel 10

Eloquent Relationship Polymorphic Laravel 10 - one to one polymorphic - one to many polymorphic - many to many polymorphic

Ditulis oleh Abdul
Dipublikasikan pada 07 Sep 2023 Diperbaharui pada 10 Jun 2024

Daftar Isi

Polymorphic Relationship

Dengan polymorhic memungkinkan kita mempunyai data yang berhubungan hanya dengan asosiasi tunggal. kedengerannya agak membingungkan, gimana maksudnya? kita bahas lagi lebih jauh ya.

Ada beberapa jenis polymorhic, diantaranya:

1. One to one polymorphic

Mirip dengan relasi one to one, akan tetapi di polymorphic kita bisa merelasikan dengan lebih satu Model, Sebagai contoh, jika database kita memiliki table User dan Post dimana table ini umumnya memiliki image, kita bisa menyimpan image tersebut ke dalam satu table terpisah, misalnya table Image.

Contoh struktur tablenya kurang lebih seperti ini:

posts
    id - integer
    name - string
 
users
    id - integer
    name - string
 
images
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

Mungkin sudah ada sedikit pencerahan ya sampai sini,

Jadi pada table images akan berisi image dari users dan post. jadi pada field imageable_id ini akan berisi id dari table post ataupun users, dan bisa saja id ini sama, nah imageable_type ini lah yang akan menjadi pembedanya, imageable_type akan diisi dengan model dari pemilik id tersebut.

Struktur Model

Ini struktur dari ketiga model tersebut

app/Models/Image.php
<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
 
class Image extends Model
{
    /**
     * Get the parent imageable model (user or post).
     */
    public function imageable(): MorphTo
    {
        return $this->morphTo();
    }
}
app/Models/Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphOne;
 
class Post extends Model
{
    /**
     * Get the post's image.
     */
    public function image(): MorphOne
    {
        return $this->morphOne(Image::class, 'imageable');
    }
}
app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphOne;
 
class User extends Model
{
    /**
     * Get the user's image.
     */
    public function image(): MorphOne
    {
        return $this->morphOne(Image::class, 'imageable');
    }
}

Menampilakan data

Untuk menampilkan data image yang ada di Post adalah seperti ini

use App\Models\Post;
 
$post = Post::find(1);
 
$image = $post->image;

pada $post->image image itu adalah properti dinamis atas function image() pada model Post. dan kalau untuk image yang ada di User tinggal ganti aja model Post nya jadi model User

Kemudian kalau kita mau menampilkan Post atau User berdasarkan Image akan seperti ini kodenya:

use App\Models\Image;
 
$image = Image::find(1);
 
$imageable = $image->imageable;

Mirip mirip kan ya.

2. One to many polymorphic

Sekali lagi ini mirip seperti one to one polymorphic hanya saja ini kita bisa memiliki lebih dari satu atau banyak data,

app/Models/User.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphMany;
 
class User extends Model
{
    /**
     * Get the user's image.
     */
    public function images(): MorphMany
    {
        return $this->morphMany(Image::class, 'imageable');
    }
}

Menampilkan data

Perlu diingat, karena ini lebih dari satu, jadi akan menghasilkan collection ya. jadi untuk menampilakan datanya kita bisa gunakan foreach

use App\Models\Post;
 
$post = Post::find(1);
 
foreach ($post->images as $image) {
    // ...
}

Komentar