在两个模型上使用 hasMany 处理 Eager Load Error
Posted
技术标签:
【中文标题】在两个模型上使用 hasMany 处理 Eager Load Error【英文标题】:Sequelize Eager Load Error with hasMany on two models 【发布时间】:2020-01-11 09:45:34 【问题描述】:我有两个模型(课程和公司),它们作为外键关联到日志模型中。我可以在 Log 模型的查询中毫无问题地包含/加入 Course 模型,但是 Company 模型总是会引发 Sequelize Eager Loading 错误。
我尝试在 hasMany 和 belongsTo 关联中使用“as: Companies”,但没有奏效。我也尝试过重新排序,但没有成功。
// The log model
module.exports = (sequelize, DataTypes) =>
const Log = sequelize.define("Log",
user:
type: DataTypes.STRING,
allowNull: false
,
...other values
)
Log.associate = models =>
models.Log.belongsTo(models.Company,
foreignKey:
allowNull: false
)
Log.associate = models =>
models.Log.belongsTo(models.Course,
foreignKey:
allowNull: false
)
return Log
// the Course model
module.exports = (sequelize, DataTypes) =>
const Course = sequelize.define("Course",
name:
type: DataTypes.STRING,
allowNull: false
,
courseId:
type: DataTypes.INTEGER
)
Course.associate = models =>
models.Course.hasMany(models.Log)
return Course
// The Company model which does not work in a query:
module.exports = (sequelize, DataTypes) =>
const Company = sequelize.define("Company",
name:
type: DataTypes.STRING,
allowNull: false
)
Company.associate = models =>
models.Company.hasMany(models.Log)
return Company
// And finally the query, where swapping the include to be [db.Course] works, however db.Company does not:
db.Log.findAll(
attributes: [
"CompanyId",
],
include: [db.Company]
)
.then(dbCompanies =>
res.json(dbCompanies)
)
.catch(err => res.send(err));```
Including the course model brings in that data without any issue, but any time the company is used, it throws an error. They are identical, from what I can see.
【问题讨论】:
【参考方案1】:您的逻辑是正确的,但语法错误。加载模型时会调用模型的“关联”方法。您希望将“日志”模型与“公司”和“课程”模型相关联,但是您定义了两次“关联”,并且与 javascript 中的所有变量一样,只有最后一个定义很重要。将“日志”和“公司”模型相关联的原始定义被覆盖,这就是您收到上述错误的原因。
相反,您可以创建一个“关联”方法来创建两个关联:
Log.associate = models =>
models.Log.belongsTo(models.Company,
foreignKey:
allowNull: false
)
models.Log.belongsTo(models.Course,
foreignKey:
allowNull: false
)
【讨论】:
这解决了它 - 看起来很简单。 Sequelize 没有最用户友好的文档。谢谢!以上是关于在两个模型上使用 hasMany 处理 Eager Load Error的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eager Loading 在单个注入模型上
如何在 Laravel 8 中获取与 json 有一个 hasMany 关系的表的所有模型?
当同一模型也存在 HasMany 关系时,如何更新 HasOne 关系?
sequelizejs 关系/关联,hasMany/belongsTo vs 定义模型上的参考