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

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>
  • 模型关联外键定义错误:
    1. 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');
    }
    
    1. Comment模型的article()关联建议明确外键,避免框架自动解析出错:
    public function article()
    {
        return $this->belongsTo(Article::class, 'article_id');
    }
    
  • 控制器缺少参数校验、异常处理:原代码未校验参数合法性,也未处理文章不存在的场景,且存在冗余代码,修复后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:48:18