Laravel 9中如何通过文章关联获取投票的创建者?
问题解决方法
错误原因
你调用$article->votes->with('creator')报错,是因为$article->votes返回的是Eloquent Collection(已查询完成的结果集合),而with()是Eloquent查询构建器(QueryBuilder)的方法,只能用于未执行的查询上,集合对象本身没有with方法,所以抛出了BadMethodCallException。
三种正确实现方式
1. 预加载关联(推荐,避免N+1查询问题)
在获取Article模型实例时,直接通过with()嵌套预加载votes和对应的creator关联:
// 获取指定ID的文章,同时预加载投票及投票创建者 $article = Article::with('votes.creator')->find($articleId); // 直接访问即可得到包含creator的votes集合 $votesWithCreators = $article->votes;
2. 延迟加载关联(适用于已获取Article实例的场景)
如果已经拿到了$article实例,想要后续加载关联数据,可以使用load()方法:
// 对已存在的文章实例,延迟加载投票及创建者 $article->load('votes.creator'); // 之后访问votes就能获取带creator的集合 $votesWithCreators = $article->votes;
3. 通过关联查询构建器直接查询
也可以通过votes()获取关联的查询构建器,再调用with()预加载creator,最后执行查询:
// 直接查询当前文章的所有投票,并附带创建者信息 $votesWithCreators = $article->votes()->with('creator')->get();
核心区别梳理
$article->votes:执行查询,返回已加载的投票集合$article->votes():返回关联的查询构建器,未执行查询,可继续调用with()、where()等查询方法with():用于查询构建阶段的预加载,减少数据库查询次数load():用于已存在模型实例的延迟加载,补充加载关联数据
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

