You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:56:10