php 38 lines · 5 steps

Polymorphic comments in Laravel with morphTo

One Comment model attaches to both Posts and Videos through Eloquent's polymorphic morphTo relationship.

Explained by highlit
1<?php
2 
3namespace App\Models;
4 
5use Illuminate\Database\Eloquent\Model;
6use Illuminate\Database\Eloquent\Relations\BelongsTo;
7use Illuminate\Database\Eloquent\Relations\MorphTo;
8 
9class Comment extends Model
10{
11 protected $fillable = ['body', 'user_id'];
12 
13 public function commentable(): MorphTo
14 {
15 return $this->morphTo();
16 }
17 
18 public function author(): BelongsTo
19 {
20 return $this->belongsTo(User::class, 'user_id');
21 }
22}
23 
24class Post extends Model
25{
26 public function comments(): MorphMany
27 {
28 return $this->morphMany(Comment::class, 'commentable')->latest();
29 }
30}
31 
32class Video extends Model
33{
34 public function comments(): MorphMany
35 {
36 return $this->morphMany(Comment::class, 'commentable')->latest();
37 }
38}
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1Polymorphic relations let one table serve many parent types without a foreign key per type.
  2. 2morphTo on the child pairs with morphMany on each parent to complete the two-way link.
  3. 3A relationship method can return a chained query so every access carries default constraints like ordering.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Polymorphic comments in Laravel with morphTo — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code