想出了如何做到这一点。
在您的初始化脚本中,您必须遍历所有模型并执行 [model].associate(models)。
类似
const tableNames = Object.keys(models)
for (let modelName of tableNames) {
let model = models[modelName]
if (typeof model.associate === 'function') model.associate(db)
}
在您的模型中,您有一个关联功能。
在 v3/v4 中
classMethods: {
associate: function (models) {
...
}
}
在 v5 中
[model].associate(){
}
或者如果你使用类定义而不是定义你有一个关联属性。
创建第二个函数来创建非外键关联。
在 v3/v4 中
classMethods: {
associate: function (models) {
...
},
nfkAssociate: function (models) {
[model].belongsTo(...)
}
}
在 v5 中
[model].nfkAssociate = function (models) {
[model].belongsTo(...)
}
然后在你的初始化脚本中
const tableNames = Object.keys(models)
for (let modelName of tableNames) {
let model = models[modelName]
if (typeof model.associate === 'function'){
model.associate(db)
}
}
db.doNFKAssociations = function () {
for (let modelName of tableNames) {
const model = db[modelName]
if (model.nfkAssociate) {
model.nfkAssociate(db)
}
}
}
if (!config.delayNFKAssociations) {
db.doNFKAssociations()
}
默认情况下,您会立即运行 associate() 和 nfkAssociate()。如果您处于运行自动化测试等情况,您可以在初始化配置中添加一个额外的属性“delayNFKAssociations”,这将阻止辅助关联的执行。
你在哪里使用sync():
await sqldb.sequelize.sync({force: true }).then(() => {
// create all of the associations that shouldn't have foreign keys associated
sqldb.doNFKAssociations()
})
现在您在 sync() 方法运行后创建关联,并且您不会得到不需要的外键。