Sequelize:通过belongsToMany关联查询时defaultScope的Include失效
解决Sequelize多对多中间表defaultScope包含关联报错问题
问题核心
当CommodityContract作为belongsToMany的中间表时,Sequelize对其defaultScope的解析逻辑与普通模型存在差异:直接在defaultScope中通过model引用关联模型,可能因模型初始化顺序或关联识别规则触发Include unexpected错误;同时默认查询多对多关联时,Sequelize不会自动应用中间表的defaultScope。
解决方案
方案1:主查询中显式启用中间表scope
修改主查询的Commodity关联配置,通过through字段指定启用中间表的defaultScope:
const contract = await Contract.findOne({ where: { id }, include: [ { model: sequelize.models.Commodity, through: { model: sequelize.models.CommodityContract, scope: true // 启用中间表的defaultScope } }, sequelize.models.ContractSubstance, sequelize.models.Client, sequelize.models.Invoice.scope('default_includes') ] })
方案2:中间表defaultScope使用关联名称而非直接引用模型
先在CommodityContract模型中定义与关联表的关联(以CommodityContractPayments为例):
// CommodityContract模型文件 CommodityContract.hasMany(sequelize.models.CommodityContractPayments, { foreignKey: 'contract_id', as: 'payments' // 可自定义别名,省略则默认使用驼峰模型名 }); // 其余三个关联(TreatmentCharges/RefiningCharges/PriceParticipation)同理定义
再修改CommodityContract的defaultScope,使用关联名称(或自定义别名):
defaultScope: { include: [ 'payments', // 对应上述定义的别名,无别名则用'commodityContractPayments' 'treatmentCharges', 'refiningCharges', 'priceParticipation' ] }
方案3:定义多对多关联时默认启用中间表scope
在Commodity与Contract的belongsToMany关联定义中,直接配置through的scope参数,让所有该关联的查询自动应用中间表的defaultScope:
Commodity.belongsToMany(models.Contract, { through: { model: models.CommodityContract, scope: true }, foreignKey: 'commodity_id', otherKey: 'contract_id' })
内容的提问来源于stack exchange,提问作者Alvaro Carvalho
相关产品推荐
相关产品推荐

