【问题标题】:Extra columns in many to many junction table are not added/updated in Sequelize在 Sequelize 中未添加/更新多对多联结表中的额外列
【发布时间】: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_idgoal_id已成功添加,但objectivedescription仍为@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


【解决方案1】:

所以,正如我所说,我不知道如何在这方面正确配置 Sequelize,我认为这是浪费时间。我会做的,只是执​​行一个原始查询。请注意,在您的情况下,您正在对数据库执行完全不必要的查询,首先通过其 id 获取 Company 记录,然后执行另一个查询以创建关系(2 个查询而不是 1...)

因此,您可以将所需的关系字段(例如来自 ajax 请求)传递给您的快速应用程序(假设这是您正在使用的):

const {companyId,goalId,objective,description} = req.body;

然后执行查询:

db.query(`insert into company_goal_relation (company_id,goal_id , objective, description,createdAt,updatedAt) values (?,?,?,?,NOW(),NOW()) `,{
        replacements:[companyId,goalId,objective,description]
    })

请注意,“db”是您一开始设置的 sequelize 对象,您需要从配置/设置文件中导入它。

当然,这不是“正常”的续集方式,但我认为没有理由不这样做,然后故事就结束了:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2019-10-16
    • 2016-07-07
    • 2013-02-03
    • 2017-12-23
    • 2015-04-19
    • 2011-07-04
    相关资源
    最近更新 更多