Laravel博客:如何在Blade模板显示登录用户的帖子收藏状态
解决Laravel Blade模板中区分用户已收藏帖子的问题
嘿,我来帮你搞定这个问题!你现在的核心需求是在页面初始渲染时,就能根据登录用户的收藏状态,把已收藏帖子的图标显示为红色(或者搭配实心图标,视觉上更直观)。咱们可以通过Eloquent关联+预加载的方式来实现,既优雅又能避免性能问题。
步骤1:在User模型中定义多对多关联
因为bookmarks表是users和posts之间的中间表,咱们可以直接在User模型里定义和Post的多对多关联:
// app/Models/User.php public function bookmarkedPosts() { // 参数依次是关联模型、中间表名、当前模型外键、关联模型外键 return $this->belongsToMany(Post::class, 'bookmarks', 'user_id', 'post_id'); }
步骤2:在控制器中预加载用户收藏的帖子ID
为了避免N+1查询(每个帖子都单独查一次收藏状态),咱们在获取帖子列表时,先把当前登录用户收藏的所有帖子ID取出来,传到视图里:
// app/Http/Controllers/PostsController.php public function index() { // 获取所有帖子(可根据需求添加分页、排序等逻辑) $posts = Post::with(['user'])->get(); // 如果用户已登录,获取他收藏的帖子ID集合 if(auth()->check()) { // pluck提取posts.id字段,转成数组方便后续判断 $bookmarkedPostIds = auth()->user()->bookmarkedPosts()->pluck('posts.id')->toArray(); return view('posts.index', compact('posts', 'bookmarkedPostIds')); } // 用户未登录时,只传帖子数据 return view('posts.index', compact('posts')); }
步骤3:在Blade视图中判断收藏状态并渲染
现在就可以在你原来的代码里,用in_array判断当前帖子ID是否在用户收藏的ID数组里了。另外建议把已收藏的图标换成实心的fa-bookmark,视觉区分度更高:
<span class="desktop-post-read-later"> @if(Auth::guest()) <span class="post-read-later" data-type="add" data-id="{{$post->id}}" title="Please login to bookmark this post!"> <i class="bookmark fa fa-bookmark-o" id="bookmark_{{$post->id}}"></i> </span> @else <span class="post-read-later" data-type="add" data-id="{{$post->id}}"> {{-- 这里就是你需要填充的判断条件 --}} @if(in_array($post->id, $bookmarkedPostIds ?? [])) <i class="bookmark fa fa-bookmark" id="bookmark_{{$post->id}}" style="color:red"></i> @else <i class="bookmark fa fa-bookmark-o" id="bookmark_{{$post->id}}"></i> @endif </span> @endif </span>
额外提醒:避开性能陷阱
如果你图省事,直接在Blade里写下面的判断,虽然能实现功能,但会触发N+1查询(每个帖子都执行一次SQL),当帖子数量多的时候性能会很差,非常不推荐:
{{-- 不推荐!会有严重的性能问题 --}} @if(auth()->user()->bookmarkedPosts()->where('post_id', $post->id)->exists())
内容的提问来源于stack exchange,提问作者Saurabh Mistry
相关产品推荐
相关产品推荐

