Sequelize关联查询异常:Log关联Company触发Eager Load Error
问题根源:Log模型的关联方法被重复覆盖了
你看你的Log模型代码里,associate被连续赋值了两次:
Log.associate = models => { models.Log.belongsTo(models.Company, { foreignKey: { allowNull: false } }) } Log.associate = models => { models.Log.belongsTo(models.Course, { foreignKey: { allowNull: false } }) }
第二次的赋值直接覆盖了第一次的函数,所以Company和Log的belongsTo关联根本没被Sequelize注册!这就是为什么include Company时会抛出Eager Loading Error——框架完全不知道这个关联存在。而Course能正常工作,是因为你只覆盖掉了Company的关联,Course的belongsTo还在,加上Course模型里的hasMany也配置正确,所以查询能正常执行。
修复方案:合并关联逻辑
把Log模型里的两个associate方法合并成一个,同时注册两个关联:
// 修改后的Log模型 module.exports = (sequelize, DataTypes) => { const Log = sequelize.define("Log", { user: { type: DataTypes.STRING, allowNull: false }, {...other values} }) Log.associate = models => { // 同时注册两个belongsTo关联 models.Log.belongsTo(models.Company, { foreignKey: { allowNull: false } }) models.Log.belongsTo(models.Course, { foreignKey: { allowNull: false } }) } return Log }
验证修复
修改后重新运行你的查询:
db.Log.findAll({ attributes: [ "CompanyId", ], include: [db.Company] }) .then(dbCompanies => { res.json(dbCompanies) }) .catch(err => res.send(err));
这次应该就能正常加载Company关联了。
额外注意点
- 确保你的数据库表
Logs里确实存在CompanyId和CourseId这两个外键字段(Sequelize默认会用关联模型名+Id作为外键,这里的配置是符合默认规则的)。 - 如果后续需要自定义关联别名(比如
as参数),要确保belongsTo和对应的hasMany两边的as值保持一致,不过你当前的场景不需要额外设置别名。
内容的提问来源于stack exchange,提问作者jstevens79
相关产品推荐
相关产品推荐

