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,提问作者ШайтанЯкубович
相关产品推荐
相关产品推荐

