Sequelize:包括通过belongsToMany关联查询对象时不在defaultScope上工作

问题描述 投票:0回答:1

我正在尝试将包含对象移动到模型的默认范围

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 中工作,但有时则不然。有人告诉我这与多对多关联有关,但我不确定。

任何帮助将不胜感激!

node.js sequelize.js
1个回答
0
投票

这是由于sequelize 中模型的加载顺序存在问题造成的。无论出于何种原因,在评估 defaultScope 之前都不会加载部分或全部关联。解决这个问题的方法是在定义关联后立即以编程方式添加默认范围。

DB.firstModel.addAssociation...
DB.firstModel.addScope
© www.soinside.com 2019 - 2024. All rights reserved.