gpt4 book ai didi

mysql - 如何在 Sequelize 中正确设置自定义 'through' 表?

转载 作者:行者123 更新时间:2023-11-29 15:37:59 24 4
gpt4 key购买 nike

我正在尝试在使用 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;

以下是当前型号:任务.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
}

规划.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
}

规划任务.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

我想知道订单是否存在问题(关联在计划、规划任务、任务的订单中注册),但当我更改订单时,它仍然不起作用。该表已正确创建,但是当我尝试使用 Planning.add([task]) 输入任务时,它会运行以下查询:

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

因此,对于 PlanningId,它尝试使用“= 1”,这是正确的,但对于 TaskId,它使用“IN (1)”,这是不正确的。在本例中,1 是正确的任务 ID。

我在关联中做错了什么,或者我尝试输入任务的方式有问题吗?

最佳答案

我的错误。 “完成”列仍然设置为必需,在我的测试中,我没有为其发送值,其余部分工作正常。

关于mysql - 如何在 Sequelize 中正确设置自定义 'through' 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com