Laravel的whereInstanceOf
方法提供了一种简洁的方式来根据对象类型过滤集合,这在处理多态关系或混合对象集合时特别有用。
以下是一个简单的例子,展示如何使用whereInstanceOf
过滤一个包含User
和Post
对象的集合:
<?php use App\Models\User; use App\Models\Post; use Illuminate\Support\Collection; $collection = collect([ new User(['name' => 'John']), new Post(['title' => 'Hello']), new User(['name' => 'Jane']), ]); $users = $collection->whereInstanceOf(User::class);
让我们来看一个更实际的例子:处理包含不同类型活动的通知Feed。
<?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 { // 获取所有活动 $activities = collect([ ...$user->comments()->latest()->limit(5)->get(), ...$user->likes()->latest()->limit(5)->get(), ...$user->follows()->latest()->limit(5)->get(), ]); // 按创建时间排序 $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
简化了集合中基于类型的过滤,使处理混合对象类型更容易,同时保持代码简洁易读。
以上是通过类型过滤收集对象,的详细内容。更多信息请关注PHP中文网其他相关文章!