Laravel使用外键时报Call to a member function comments() on null错误
Laravel评论功能报错
Call to a member function comments() on null修复 报错核心原因是执行$article->comments()时$article值为null,即Article::find($request->article_id)未查询到对应文章记录,同时代码中存在多处关联定义、参数传值错误,逐一修复即可:
- 模板隐藏域未传值:表单中
article_id隐藏域未设置value属性,提交时参数为空,导致查询不到文章。修复后表单代码:
<form method="post" action="{{ route('comment.store') }}"> @csrf <div class="form-group"> <textarea class="form-control" name="comment" required></textarea> <!-- 替换$article为你文章详情页传入的文章变量名 --> <input type="hidden" name="article_id" value="{{ $article->id }}"/> </div> <div class="form-group"> <input type="submit" class="btn btn-success" value="提交评论" /> </div> </form>
- 模型关联外键定义错误:
- Article模型的
user()关联外键应为文章表的user_id,comments()关联外键应为评论表的article_id,原代码错误写为id(表主键),修复后代码:
public function user() { return $this->belongsTo(User::class, 'user_id'); } public function comments() { return $this->hasMany(Comment::class, 'article_id'); }- Comment模型的
article()关联建议明确外键,避免框架自动解析出错:
public function article() { return $this->belongsTo(Article::class, 'article_id'); } - Article模型的
- 控制器缺少参数校验、异常处理:原代码未校验参数合法性,也未处理文章不存在的场景,且存在冗余代码,修复后store方法:
public function store(Request $request) { // 参数校验,非法请求直接返回错误 $validated = $request->validate([ 'comment' => 'required|string|max:1000', 'article_id' => 'required|integer|exists:articles,id' ]); $comment = new Comment; $comment->user_id = auth()->id(); $comment->comment = $validated['comment']; // findOrFail会在文章不存在时直接返回404,避免null调用方法 $article = Article::findOrFail($validated['article_id']); $article->comments()->save($comment); return redirect()->back()->with('success', '评论提交成功'); }
注意:评论提交路由需要挂载
auth中间件,保证只有登录用户可以提交,否则auth()->id()返回null会导致评论用户ID字段报错。
内容的提问来源于stack exchange,提问作者user10522002
相关产品推荐
相关产品推荐

