我正在尝试将包含对象移动到模型的默认范围
CommodityContract
。然而,当我这样做时,sequelize 在查询结果时会抛出一个错误:
'Include unexpected. Element has to be either a Model, an Association or an object.'
这是我的代码块,如果我将其放入自定义范围内,它会完美运行。
defaultScope: {
include: [
{
model: sequelize.models.CommodityContractPayments,
required: false
},
{
model: sequelize.models.CommodityContractTreatmentCharges,
required: false
},
{
model: sequelize.models.CommodityContractRefiningCharges,
required: false
},
{
model: sequelize.models.CommodityContractPriceParticipation,
required: false
},
]
}
问题是我试图将此特定模型作为属于多关联中的直通对象进行查询,因此我不确定在查询时如何应用范围,除非我进行另一个单独的查询,我试图避免。
主要查询如下所示:
const contract = await Contract.findOne(
{
where: { id },
include: [
sequelize.models.Commodity,
sequelize.models.ContractSubstance,
sequelize.models.Client,
sequelize.models.Invoice.scope('default_includes')
]
})
其中
Commodity
通过 Contract
链接到 CommodityContract
:
Commodity.belongsToMany(models.Contract, {
through: models.CommodityContract,
foreignKey: 'commodity_id',
otherKey: 'contract_id'
})
并且范围“default_includes”在模型中被定义为
Invoice
:
scopes: {
default_includes: () => {
return {
include: [
{
model: sequelize.models.InvoiceVersion,
required: false
},
{
model: sequelize.models.Contract,
required: false,
},
{
model: sequelize.models.User,
required: false,
},
]
}
}
}
我以前曾多次遇到过这个问题,这让我非常烦恼。有时,包含在 defaultScope 中工作,但有时则不然。有人告诉我这与多对多关联有关,但我不确定。
任何帮助将不胜感激!
这是由于sequelize 中模型的加载顺序存在问题造成的。无论出于何种原因,在评估 defaultScope 之前都不会加载部分或全部关联。解决这个问题的方法是在定义关联后立即以编程方式添加默认范围。
DB.firstModel.addAssociation...
DB.firstModel.addScope