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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:50:20