Easy Polymorphic Relationships in Laravel ! One To One Relationship ?
Kepson Diaz
Posted on March 8, 2024
*Introduction : *
Polymorphism in Laravel is a powerful feature that allows a model to belong to multiple other models. It enables a single association to be linked to various models, providing flexibility and reusability in database relationships.
*One to One Relationship : *
In a one-to-one polymorphic relationship, a model can belong to one and only one other model, but that model can have multiple types it can belong to.
For example, a Product
and a Post
may share a polymorphic relation to an Image
model. Using a one-to-one polymorphic relation allows you to have a single table of unique images that may be associated with products and post.
To establish a one-to-one polymorphic relationship in Laravel, you can use the morphOne
and morphTo
methods.
For our example, the morphOne
method is used in the child model: Image to define the relationship, while the morphTo
method is used in the parent models: Product and Post to define the inverse relationship.
First, let's examine the table structure:
products
id - integer
name - string
posts
id - integer
name - string
images
id - integer
url - string
imageable_id - integer
imageable_type - string
Notice :
imageable_id
column will contain the ID value of the products or posts, while the imageable_type
column will contain the class name of the parent model.
The models structure will look like this:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Image extends Model
{
/**
* Get the parent imageable model (product or post).
*/
public function imageable(): MorphTo
{
return $this->morphTo();
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class Product extends Model
{
/**
* Get the product'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\MorphTo;
class Post extends Model
{
/**
* Get the post's image.
*/
public function image(): MorphOne
{
return $this->morphOne(Image::class, 'imageable');
}
}
Once your database table and models are defined, you may access the relationships via your models.
Example :
use App\Models\Image;
$image = Image::find(1);
$imageable = $image->imageable;
The imageable relation on the Image model will return either a Product or Post instance.
Posted on March 8, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.