Laravel 5.1:传递帖子ID至另一数据库及评论功能实现问题
嘿,看你已经把表单和路由都配置得差不多了,应该是在CommentsController的store方法里卡壳了吧?我来给你捋捋几种常见的正确实现方式,帮你把帖子ID顺利传递并插入评论到数据库:
1. 用模型依赖注入优雅关联评论
Laravel的路由参数支持自动注入模型实例,这是最推荐的写法——既能自动验证帖子是否存在(不存在直接返回404),还能直接通过模型关联创建评论:
首先在你的CommentsController里这样写store方法:
public function store(Request $request, Post $post) { // 先做表单验证,确保评论内容合法(这一步很重要,避免脏数据) $validatedData = $request->validate([ 'content' => 'required|string|max:500', // 可根据你的需求调整长度限制 ]); // 通过帖子模型关联创建评论,自动带上post_id $post->comments()->create([ 'content' => $validatedData['content'], // 如果你的评论需要关联登录用户,加上这行(前提是开启了用户认证) 'user_id' => auth()->id(), ]); // 重定向回原帖子页面,顺便给个成功提示 return back()->with('success', '评论发布成功啦!'); }
然后要确保你的模型已经定义了正确的关联关系:
- 在
Post.php模型中:
public function comments() { return $this->hasMany(Comment::class); }
- 在
Comment.php模型中:
public function post() { return $this->belongsTo(Post::class); }
同时,Comment模型要设置可批量赋值的字段,避免MassAssignmentException错误:
protected $fillable = ['post_id', 'content', 'user_id'];
2. 直接获取帖子ID的写法(适合不需要模型操作的场景)
如果你不想用模型注入,也可以直接接收路由里的帖子ID参数:
public function store(Request $request, $postId) { $validatedData = $request->validate([ 'content' => 'required|string|max:500', ]); // 直接创建评论,手动传入post_id Comment::create([ 'post_id' => $postId, 'content' => $validatedData['content'], 'user_id' => auth()->id(), ]); return back()->with('success', '评论发布成功!'); }
这种写法同样需要确保Comment模型的$fillable包含post_id字段,且数据库的comments表有post_id这个外键字段。
3. 常见坑点排查
- 不要忘了加CSRF令牌:你的表单里必须加上
@csrf指令,否则Laravel会拦截POST请求并返回419错误,正确的表单结构应该是:
<form method="POST" action="/posts/{{ $post->id }}/comments"> @csrf <div> <textarea name="content" placeholder="写下你的评论..." required></textarea> </div> <button type="submit">发布评论</button> </form>
- 检查数据库表结构:
comments表必须有post_id字段(类型为整数,设置外键关联posts表的id),如果需要关联用户还要有user_id字段。 - 路由参数名要对应:路由里的
{post}要和控制器方法里的参数名逻辑对应(模型注入时参数类型为Post,变量名建议用$post;直接传ID时变量名可以自定义,不影响路由匹配)。
内容的提问来源于stack exchange,提问作者Ramon
相关产品推荐
相关产品推荐

