Sequelize EagerLoadingError:使用include查询时模型关联失效问题
Sequelize预加载关联查询报错的解决办法
问题情况
从现有数据库自动生成了Sequelize模型,连带着关联关系和别名都配置好了,但用include做预加载查询时,一直触发SequelizeEagerLoadingError,试了好几种写法都没用。
核心原因
看你的关联配置代码,user和userDetail的关联是这么定义的:
user.belongsTo(userDetail, { as: "user_details_user_detail", foreignKey: "user_details"});
这里给belongsTo关联设置了自定义别名user_details_user_detail,Sequelize在预加载时必须匹配这个别名,否则会认为关联不存在。
正确的预加载写法
写法一:直接用关联别名
最简单的方式,直接写关联时定义的别名:
let userRecord = await db.user.findAll({ include: ["user_details_user_detail"] })
写法二:完整指定模型+别名
如果要显式指定模型,必须同时带上as参数,和关联定义的别名保持一致:
let userRecord = await db.user.findAll({ include: { model: db.userDetail, as: "user_details_user_detail" // 这里必须和关联配置的别名完全匹配 } })
之前写法无效的原因
- 直接传
db.userDetail:因为关联时设置了自定义别名,Sequelize不会自动绑定模型,必须指定别名 - 用
"user_detail":这个别名根本没在关联里定义,自然找不到 - 只写
model: db.userDetail:缺少as参数,Sequelize不知道对应哪个关联关系
修正后的完整代码
const db = require('../../../database/models/index'); module.exports = async function(parents, args) { let userRecord = await db.user.findAll({ // 推荐用别名写法,简洁 include: ["user_details_user_detail"] }) // 注意:findAll返回的是数组,判断是否为空要检查length if(userRecord.length === 0){ throw new Error('No record found') } return{ message:'successfull' } }
内容的提问来源于stack exchange,提问作者Singingsongs
相关产品推荐
相关产品推荐

