Как правильно настроить настраиваемую «сквозную» таблицу в Sequelize? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь настроить пользовательскую сквозную таблицу в проекте, который использует Sequelize.У меня есть таблица планировок и таблица задач.Теперь я хочу реализовать таблицу, которая связывает их, но я хочу добавить пользовательский столбец «готово».При запуске sync() кажется, что все таблицы настроены правильно.Это запрос, который выполняется для настройки таблицы PlanningTask:

CREATE TABLE IF NOT EXISTS `PlanningTask` 
(`done` TINYINT(1) NOT NULL, `PlanningId` INTEGER(11) , `TaskId` INTEGER(11) ,
 PRIMARY KEY (`PlanningId`, `TaskId`), 
FOREIGN KEY (`PlanningId`) REFERENCES `Plannings` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (`TaskId`) REFERENCES `Tasks` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) 
ENGINE=InnoDB;

Вот текущие модели: task.js

module.exports = (sequelize, DataTypes) => {
    const Task = sequelize.define('Task', {
        id: {
            type: DataTypes.INTEGER(11),
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        type: {
            type: DataTypes.STRING,
            allowNull: false
        },
        description: {
            type: DataTypes.STRING,
            allowNull: false
        },
    })
    Task.associate = function(models) {
        Task.belongsToMany(models.Planning, {
            through: 'PlanningTask'
        })
    }
    // Methods
    return Task
}

planning.js

module.exports = (sequelize, DataTypes) => {
  const Planning = sequelize.define('Planning', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      autoIncrement: true,
      primaryKey: true
    },
    title: {
      type: DataTypes.STRING,
      allowNull: false
    }
    })
    Planning.associate = function (models) {
        Planning.belongsTo(models.User, {
            foreignKey: 'owner'
        })
        Planning.belongsToMany(models.Task, {
            through: 'PlanningTask'
        })
  }
  // Methods
  return Planning
}

planningtask.js

module.exports = (sequelize, DataTypes) => {
  const PlanningTask = sequelize.define('PlanningTask', {
    done: {
      type: DataTypes.BOOLEAN,
      allowNull: false
    }
    }, {
        timestamps: false,
        freezeTableName: true       
    })
    PlanningTask.associate = function (models) {
        PlanningTask.belongsTo(models.Planning)
        PlanningTask.belongsTo(models.Task)
  }
  // Methods
  return PlanningTask
}

Все модели загружаются со следующим файлом index.js:

const fs = require('fs')
const path = require('path')
const Sequelize = require('sequelize')
const config = require('../config/config')
const db = {}

const sequelize = new Sequelize(
  config.db.database,
  config.db.user,
  config.db.password,
  config.db.options
)

fs
  .readdirSync(__dirname)
  .filter((file) =>
    file !== 'index.js'
  )
  .forEach((file) => {
    const model = sequelize.import(path.join(__dirname, file))
    db[model.name] = model
  })

Object.keys(db).forEach(function (modelName) {
  if ('associate' in db[modelName]) {
    db[modelName].associate(db)
  }
})

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db

Мне было интересно, могут ли быть какие-то проблемы с заказом (ассоциации связаны сзарегистрирован в порядке планирования (PlanningTask, Task), но когда я меняю заказ, он все равно не работает.Таблица создана правильно, но когда я пытаюсь ввести Задачу, используя Planning.add ([задача]), она запускает следующий запрос:

SELECT `done`, `PlanningId`, `TaskId`
FROM `PlanningTask` AS `PlanningTask`
WHERE `PlanningTask`.`PlanningId` = 1 AND `PlanningTask`.`TaskId` IN (1);

Итак, для PlanningId она пытается «= 1»это правильно, но тогда для TaskId он использует IN (1), что не правильно.1 в этом случае правильный идентификатор задачи.

Есть ли что-то, что я делаю неправильно в ассоциациях, или есть проблема в способе ввода задач?

1 Ответ

0 голосов
/ 21 сентября 2019

Моя ошибка.Столбец «done» все еще был установлен как обязательный, и в моих тестах я не отправлял для него значение, остальное работало нормально.

...