Sequelize: добавление через ассоциацию с соединительной таблицей (n: m) - PullRequest
0 голосов
/ 23 марта 2020

У меня есть визит, который содержит много этапов. Каждая стадия может иметь много типов операций. Когда я создаю посещение, я хочу, чтобы мои этапы и их типы операций были добавлены в один go.

Например, посещение музея может иметь этап для каждого этажа и на каждом этаже, который вы можете выполнять. различные вещи (= типы операций), такие как наблюдение, прослушивание, рисование, ...

У меня есть таблица соединений между этапами (может иметь много типов операций) и типами операций (может принадлежать многим этапам)

Я могу добавить «Мое посещение» и его этапы, но, тем не менее, я стараюсь включать «Типы операций», всегда есть ошибки. Я попытался использовать атрибут ключ 'model', 'association', я попытался передать строку или объект в качестве значения, я добавил модель для таблицы соединений (OperationTypeStage) явно, но ничего не получалось. Sequelize пытается вставить в OperationTypes вместо таблицы соединений (OperationTypeStage), или я получаю любую другую ошибку («key.include не является функцией», «OperationTypeStage не связан со стадией», ...).

Может кто-нибудь пролить свет, пожалуйста?

Мои модели настроены так:

// models
const Stage = sequelizeClient.define('Stage', { sequenceNumber: DataTypes.INTEGER }, {})
const OperationType = sequelizeClient.define('OperationType', { name: DataTypes.STRING }, {})

// associations
Stage.belongsToMany(models.OperationType, { through: 'OperationTypeStage', timestamps: false })
OperationType.belongsToMany(models.Stage, { through: 'OperationTypeStage', timestamps: false })

// 'Visit' to be created
visitData = { 
  "eta":"2020-03-18T16:34:00.000Z",
  "Stages":[
    { "sequenceNumber":1 },
    { "sequenceNumber":2, "OperationTypes":[1,2] },
    { "sequenceNumber":3 },
    { "sequenceNumber":4, "OperationTypes":[2] },
  ]
}

Вот способы, которые я пробовал, но все они дают ошибку:

// creation code
await VisitModel.create(visitData, { 
  include: { 
    model: seqClient.models.Stage,
    include: { 
      association: 'OperationType'
    }
  }, 
  ...params, 
  transaction: t 
})

-

// creation code
await VisitModel.create(visitData, { 
  include: { 
    model: seqClient.models.Stage,
    include: { 
      association: 'OperationTypeStage'
    }
  }, 
  ...params, 
  transaction: t 
})

-

// creation code
await VisitModel.create(visitData, { 
  include: { 
    model: seqClient.models.Stage,
    include: { 
      model: seqClient.models.OperationType
    }
  }, 
  ...params, 
  transaction: t 
})

-

// creation code
await VisitModel.create(visitData, { 
  include: { 
    model: seqClient.models.Stage,
    include: { 
      model: seqClient.models.OperationTypeStage
    }
  }, 
  ...params, 
  transaction: t 
})

Для ясности это работает, но без каких-либо вставок в соединении стол:

// creation code
await VisitModel.create(visitData, { 
  include: { 
    model: seqClient.models.Stage,
  }, 
  ...params, 
  transaction: t 
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...