【发布时间】:2020-03-27 04:44:26
【问题描述】:
这是模型(多对多)
公司.js
module.exports = (sequelize, DataTypes) => {
const Company = sequelize.define('Company', {
company_name: DataTypes.STRING,
}, {
timestamps: true,
underscored: true,
tableName: 'company',
});
Company.belongsToMany(models.Goal, {
through: 'company_goal_relation', foreignKey: 'company_id', as: 'goal'
});
};
return Company;
};
目标.js
module.exports = (sequelize, DataTypes) => {
const Goal = sequelize.define('Goal', {
goal_name: DataTypes.STRING,
}, {
timestamps: false,
underscored: true,
tableName: 'goal',
});
Goal.associate = function(models) {
Goal.belongsToMany(models.Company, {
through: 'company_goal_relation',
foreignKey: 'goal_id',
as: 'company',
});
};
return Goal;
};
CompanyGoalRelation.js
'use strict';
module.exports = (sequelize, DataTypes) => {
const CompanyGoalRelation = sequelize.define('CompanyGoalRelation', {
company_id: DataTypes.INTEGER,
goal_id: DataTypes.INTEGER,
objective: DataTypes.STRING,
description: DataTypes.TEXT,
}, {
timestamps: false,
underscored: true,
tableName: 'company_goal_relation',
});
CompanyGoalRelation.associate = function(models) {
CompanyGoalRelation.belongsTo(models.Company, { foreignKey: 'company_id' });
CompanyGoalRelation.belongsTo(models.Goal, { foreignKey: 'goal_id' });
};
return CompanyGoalRelation;
};
我想要在这里添加或更新联结表的额外列。 我试过的在下面。
const { goal, companyId } = req.body;
const company = await Company.findByPk(companyId);
const goalInstance = await Goal.findOne({
where: { id: goal.id },
});
await company.addGoal(goalInstance, {
through: {
objective: goal.objective,
description: goal.description,
}
});
没有发生错误,company_id、goal_id已成功添加,但objective和description仍为@987654326 @。
我目前正在使用 Sequelize (5.6.0) 和 PostgreSQL。 有人可以帮忙吗? 谢谢!
【问题讨论】:
-
我知道您使用的是model.sync,对吗?我不知道你的问题的答案,但我强烈建议不要使用 model.sync,而是改用迁移。在那里,您可以完全按照您的需要手动创建每个表,并且在您对表进行每次更改之后(当然,运行迁移),您的开发/生产数据库将始终保持同步。 model.sync 不会改变您现有生产数据库的结构,因此在我看来,依赖它是毫无用处的。
-
@ibrod 感谢您的回复。知道了。如果我宁愿使用迁移,这是有道理的。但是比较其他表(OneToMany,OneToOne),一旦我在 postgreSQL 中删除表并运行模型同步,它将创建包含我在模型中定义的正确列的正确表。但唯一的问题在于多对多关联。即使我删除联结表并运行模型同步,它创建的联结表只包含外键,不包含列。我认为原因是连接表是隐式创建的?
-
是的,它是隐式创建的,我确信它可以配置,但是文档太差了,很难找到。关于迁移:一旦使用它们,就不需要(也不应该)使用 model.sync。当您创建一个新数据库时,只需在其上运行所有迁移(一个命令),一切都已创建。但是,这当然需要您在迁移中创建联结表。
-
谢谢@i.brod,很有帮助。为什么我从这个问题开始是我无法在联结表中添加/更新额外的列,即使我在 postgreSQL 中手动添加了额外的列并使用了像这里这样的 setter 函数。 stackoverflow.com/questions/39409088/…,原因是手动添加额外的列,而不是使用迁移?我不这么认为。最后,我将根据需要更新问题详细信息。
-
如何在联结表中插入记录?您是否对该表执行原始查询(这就是我所做的......),或者您是否使用了一些 Sequelize 功能?老实说,我认为 sequelize 的文档是一场灾难……很难找到有用的数据。
标签: node.js postgresql sequelize.js