Query Polymorphic Relations Expressively with whereMorphedTo()

Use whereMorphedTo() to query polymorphic models without manually checking both type and ID columns.

When querying polymorphic relationships (such as comments that belong to either a Post, Video, or Lesson), writing where('commentable_type', Post::class)->where('commentable_id', $post->id) is verbose.

whereMorphedTo() queries polymorphic targets directly from model instances.

Basic Usage

use App\Models\Comment;
use App\Models\Post;

$post = Post::find(1);

// Generates: WHERE commentable_type = 'App\Models\Post' AND commentable_id = 1
$comments = Comment::whereMorphedTo('commentable', $post)->get();

Querying Against Model Collections

You can also pass a collection of models to query across multiple polymorphic parents:

$posts = Post::where('featured', true)->get();

// Generates WHERE (commentable_type = 'Post' AND commentable_id IN (1, 2, 3))
$featuredComments = Comment::whereMorphedTo('commentable', $posts)->get();

Summary

  • Automatically infers the polymorphic type and primary key from model instances.
  • Replaces manual where('..._type', ...)->where('..._id', ...) chains.
  • Supports single models and Eloquent collections.