All posts
Difference between polymorphic and Standard relationship in Laravel
M
Mohammad Rifat Khan
· 2 min read
In Laravel, Eloquent relationships provide a convenient way to interact with related database tables. Both polymorphic relationships and standard (non-polymorphic) relationships fall under the umbrella of Eloquent relationships, but they serve different purposes.
Standard (Non-Polymorphic) Relationships:
- In standard relationships, you have a straightforward connection between two models using foreign key constraints.
- For example, you might have a
Postmodel and aCommentmodel, where each comment belongs to a post. In this case, you would have apoststable and acommentstable. Thecommentstable would have a foreign key column likepost_idthat references theidcolumn in thepoststable. - You define the relationship in the models, and Eloquent provides methods to query and retrieve related data.
Post Model:
// Post Modelclass Post extends Model{ public function comments() { return $this->hasMany(Comment::class); }}Comment Model:
// Comment Modelclass Comment extends Model{ public function post() { return $this->belongsTo(Post::class); }}Usage:
// Get comments for a post$comments = Post::find(1)->comments;Polymorphic Relationships:
- Polymorphic relationships allow a model to belong to more than one type of other model on a single association.
- This is useful when you have entities that can be associated with multiple types of other entities without having to create a separate table for each relationship.
- In a polymorphic relationship, the related model's type and ID are stored in columns on the calling model's table.
- For example, you might have a
Commentmodel that can belong to bothPostandVideomodels. In this case, you would have acommentstable withcommentable_typeandcommentable_idcolumns.
Comment Model:
// Comment Modelclass Comment extends Model{ public function commentable() { return $this->morphTo(); }}Post Model:
// Post Modelclass Post extends Model{ public function comments() { return $this->morphMany(Comment::class, 'commentable'); }}Video Model:
// Video Modelclass Video extends Model{ public function comments() { return $this->morphMany(Comment::class, 'commentable'); }}Usage:
// Get comments for a post$comments = Post::find(1)->comments;// Get comments for a video$comments = Video::find(1)->comments;In summary, standard relationships are used when there's a direct one-to-many or many-to-one connection between models, while polymorphic relationships are used when a model can belong to multiple types of other models on a single association.