Eloquent relationship polymorphic laravel 10
Eloquent Relationship Polymorphic Laravel 10 - one to one polymorphic - one to many polymorphic - many to many polymorphic
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
<?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();
}
}
<?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');
}
}
<?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,
<?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) {
// ...
}