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

如何通过Handlebars.js访问Sequelize关联查询中包含的模型数据?

问题分析与解决方法

你遇到的问题根源在于**raw: true这个查询选项**——当启用它时,Sequelize不会把关联的QuizAttempts数据嵌套成一个对象,而是将所有字段扁平化,用关联模型名.字段名作为键名(比如'QuizAttempts.id')。而你的Handlebars模板尝试访问QuizAttempts.id,相当于在对象里找一个名为QuizAttempts的属性再取它的id,但实际这个属性不存在,自然拿不到数据。

下面给你两种可行的解决办法:

方法1:移除raw: true,使用嵌套对象结构

这是更符合Sequelize关联查询习惯的方式,移除raw: true后,Sequelize会返回嵌套的对象结构,这样你的Handlebars模板就能正常访问QuizAttempts.id了。不过要注意,默认findAll返回的是Sequelize模型实例,你需要把它们转换成纯JavaScript对象:

修改后的查询代码:

const attempts = await Articles.findAll({
  include: QuizAttempts,
  where: { user_id: 13 } // 注意:你原来的where写在了第二个参数里,这是错误的!所有查询选项都应放在第一个对象参数中
});

// 将实例转换为纯对象数组
const plainAttempts = attempts.map(article => article.get({ plain: true }));

然后在Handlebars里就可以正常使用你原来的模板:

{{#each plainAttempts}}
 {{name}} {{level}} {{QuizAttempts.id}}
{{/each}}

方法2:保留raw: true,修改Handlebars访问方式

如果你因为某些原因必须保留raw: true,那需要在Handlebars里使用方括号语法来访问带点的键名:

{{#each attempts}}
 {{name}} {{level}} {{this['QuizAttempts.id']}}
{{/each}}

这里的this['QuizAttempts.id']会直接访问当前对象中键名为'QuizAttempts.id'的属性,就能正确获取到对应的数据了。

内容的提问来源于stack exchange,提问作者Corspiracy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:54:08