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

Laravel中如何实现对应文章的评论展示?已完成评论入库功能

解决文章专属评论展示问题

首先,咱们得先揪出问题根源:你当前的全局View Composer是把所有评论里最新的4条传给所有视图,完全没关联当前文章的post_id,所以不管打开哪篇文章,显示的都是同一批评论。要搞定这个,咱们得从模型关联和数据传递入手:

1. 建立文章与评论的模型关联

先给你的文章模型(假设是Post,如果是别的名字比如MusicPost就对应修改)和评论模型Music_comment添加关联关系:

在文章模型(比如app/Models/Post.php)里:

public function comments()
{
    // 关联该文章下的所有评论,第二个参数是评论表中的外键post_id
    return $this->hasMany(Music_comment::class, 'post_id');
}

在评论模型(app/Models/Music_comment.php)里:

public function post()
{
    // 关联评论所属的文章
    return $this->belongsTo(Post::class, 'post_id');
}

// 如果需要显示评论作者,再添加用户关联
public function author()
{
    return $this->belongsTo(User::class, 'author_id');
}

2. 替换全局View Composer,改为按需加载评论

全局的View Composer在这里完全不适用,咱们直接在文章详情页的控制器方法里预加载对应文章的评论,这样性能更好:

public function show($id)
{
    // 预加载当前文章的评论,按创建时间倒序取最新4条,同时预加载作者信息(可选)
    $post = Post::with(['comments' => function ($query) {
        $query->orderBy('created_at', 'desc')->limit(4)->with('author');
    }])->findOrFail($id);
    
    return view('posts.show', compact('post'));
}

3. 在Blade视图中渲染对应文章的评论

现在你已经有了带评论数据的$post变量,直接在文章详情页的视图里遍历即可:

<div class="comments-area">
    <h3>Комментарии</h3>
    
    @if($post->comments->isNotEmpty())
        @foreach($post->comments as $comment)
            <div class="single-comment">
                <p><strong>{{ $comment->author->name }}</strong> {{ $comment->created_at->format('d.m.Y H:i') }}</p>
                <p>{{ $comment->comment }}</p>
                <hr>
            </div>
        @endforeach
    @else
        <p>Пока нет комментариев — будь первым, кто оставит отзыв!</p>
    @endif

    <!-- 你的评论提交表单(保持你原来的隐藏字段即可) -->
    <form action="{{ route('comments.store') }}" method="POST" class="comment-form">
        @csrf
        <input type="hidden" value="{{ $post->post_id }}" name="post_id">
        
        <textarea name="comment" placeholder="Напишите ваш комментарий..." rows="4" required></textarea>
        
        <button type="submit" class="submit-btn">Отправить комментарий</button>
    </form>
</div>

额外注意点

  • 确保你的评论存储路由是命名路由,比如:
    Route::post('/comments', [CommentController::class, 'store'])->name('comments.store');
    
  • 如果你的文章模型不是Post,所有地方都要替换成你实际的模型名称,比如MusicPost之类的。

这样修改后,每篇文章就只会显示和自己post_id匹配的评论啦!

内容的提问来源于stack exchange,提问作者ШайтанЯкубович

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:17:34