如何通过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
相关产品推荐
相关产品推荐

