Laravel已定义模型关联仍无法显示关联名称、调用时报错如何解决
问题原因
- 你使用
DB::table('books')执行查询,返回结果是stdClass类型的普通对象,并非Book模型的实例,只有模型实例才能调用你提前定义的author()关联关系,因此会报找不到author属性的错误。 - 就算切换为模型查询,如果不预加载关联数据,会产生N+1查询问题,虽然不会直接报错,但会大幅降低接口性能。
解决方法
将BookController中index方法的查询逻辑替换为用Book模型查询,同时配合with()预加载author关联,修改后代码如下:
public function index() { return view('books.index', [ 'books' => Book::with('author')->paginate(15) ]); }
修改后返回的$books集合内的每一项都是Book模型实例,即可正常调用$book->author->name获取作者姓名。
补充注意点
- 如果存在书籍未绑定作者(
author_id为null)的场景,需要在视图中加判空逻辑避免报错,可修改为{{ $book->author->name ?? '无作者' }} - 不要混用DB门面查询和模型关联功能,DB门面走原生查询逻辑,不会加载模型中定义的关联、访问器、全局作用域等配置。
内容的提问来源于stack exchange,提问作者Xelerate
相关产品推荐
相关产品推荐

