Filtering Collection Objects by Type with whereInstanceOf
Last updated on by Harris Raftopoulos
Laravel's whereInstanceOf method provides a clean way to filter collections based on object types, particularly useful when dealing with polymorphic relationships or mixed object collections.
<?php use App\Models\User;use App\Models\Post;use App\Models\Comment;use Illuminate\Support\Collection; $collection = collect([ new User(['name' => 'John']), new Post(['title' => 'Hello']), new User(['name' => 'Jane']),]);$users = $collection->whereInstanceOf(User::class);
Let's explore a practical example of handling a notification feed with different types of activities:
<?php namespace App\Services; use App\Models\Comment;use App\Models\Like;use App\Models\Follow;use Illuminate\Support\Collection; class ActivityFeedService{ public function getUserFeed(User $user): array { // Get all activities $activities = collect([ ...$user->comments()->latest()->limit(5)->get(), ...$user->likes()->latest()->limit(5)->get(), ...$user->follows()->latest()->limit(5)->get(), ]); // Sort all activities by created_at $activities = $activities->sortByDesc('created_at'); return [ 'comments' => $activities->whereInstanceOf(Comment::class) ->map(fn (Comment $comment) => [ 'type' => 'comment', 'text' => $comment->body, 'post_id' => $comment->post_id, 'created_at' => $comment->created_at ]), 'likes' => $activities->whereInstanceOf(Like::class) ->map(fn (Like $like) => [ 'type' => 'like', 'post_id' => $like->post_id, 'created_at' => $like->created_at ]), 'follows' => $activities->whereInstanceOf(Follow::class) ->map(fn (Follow $follow) => [ 'type' => 'follow', 'followed_user_id' => $follow->followed_id, 'created_at' => $follow->created_at ]) ]; }}
WhereInstanceOf simplifies type-based filtering in collections, making it easier to handle mixed object types while maintaining clean, readable code.