Laravel Call to a member function load() on null 作者文章报错
报错原因
两个报错的核心触发点共3处:
- User模型的文章关联定义错误:一对多关联方法命名为单数
post(),但路由中调用的是复数形式的动态属性$author->posts,Laravel无法匹配到对应关联,直接返回null,对null调用load()方法就触发Call to a member function load() on null错误。 - 路由中传给视图的
posts变量为null,视图层遍历null值时触发foreach() argument must be of type array|object, null given错误。 - 路由里的title字段使用单引号包裹字符串,单引号内的PHP变量不会被解析,最终页面标题会直接显示
$author->name字面量,无法输出真实作者名。 - 额外冗余操作:Post模型已经配置
protected $with = ['category', 'author'];,全局自动预加载分类、作者关联,不需要额外调用load()方法做预加载。
修复方案
按以下顺序修改代码即可:
- 修正User模型的关联定义,一对多关联使用复数命名,匹配调用逻辑:
// User模型中修改关联方法 public function posts(){ return $this->hasMany(Post::class); }
- 修正路由闭包代码,去掉冗余load调用,修正字符串解析问题,对齐首页文章排序逻辑:
Route::get('/authors/{author:username}', function(User $author){ return view('frontend.posts', [ 'title' => "Post By Author : {$author->name}", 'posts' => $author->posts()->latest()->get(), ]); });
说明:调用
posts()方法触发查询,加latest()保证文章按发布时间倒序排列,和PostController首页的排序规则保持一致;Post模型全局自动预加载配置会自动带上分类、作者关联,不会出现N+1查询问题。
效果验证
修改完成后:
- 路由模型绑定会自动根据传入的username参数匹配对应作者,匹配失败自动返回404页面
- 可以正确拿到指定作者名下的所有文章集合,不会返回null
- 视图层可以正常遍历文章集合,渲染文章标题、摘要、分类、作者信息
- 页面标题会正确显示当前作者的名称,不会出现变量字面量
内容的提问来源于stack exchange,提问作者DapOne
相关产品推荐
相关产品推荐

