使用直通将多对多关系化后不插入其他属性

时间:2018-11-24 23:01:55

标签: sql node.js sequelize.js

我与StepControlControlsConfig之间有很多关系。 创建Control对象并调用addStep函数并指定其他属性(存在于关系表中)时,Sequelize在关系表ControlsConfig中创建记录,但属性为NULL。

PS:表已在数据库中正确创建。

  

表1:步骤

     

表2:控件

     

关系表: ControlsConfig

步骤

 var Step = sequelize.define('Step', {
    title: { type: DataTypes.STRING, allowNull: false },
    description: DataTypes.STRING,
    type: { type: DataTypes.ENUM('task', 'approval'), allowNull: false, defaultValue: 'task' },
    order: DataTypes.INTEGER
  });

  Step.associate = function(models) {
    models.Step.belongsTo(models.User);
    models.Step.belongsTo(models.Template);
    models.Step.hasMany(models.Action);
  };

控制

var Control = sequelize.define('Control', {
    label: { type: DataTypes.STRING, allowNull: false },
    order: { type: DataTypes.INTEGER },
    type: { type: DataTypes.ENUM('text', 'yes/no') },
    config: { type: DataTypes.TEXT },
    controlUiId: { type: DataTypes.STRING }
  });

  Control.associate = function(models) {
    models.Control.belongsTo(models.Section);
  };

ControlsConfigs

  module.exports = (sequelize, DataTypes) => {
  var ControlsConfig = sequelize.define('ControlsConfig', {
    visibility: { type: DataTypes.ENUM('hidden', 'readonly', 'editable', 'required') },
    config: { type: DataTypes.TEXT }
  });

  ControlsConfig.associate = function(models) {
    models.Control.belongsToMany(models.Step, { through: models.ControlsConfig });
    models.Step.belongsToMany(models.Control, { through: models.ControlsConfig });
    models.ControlsConfig.belongsTo(models.Template);
  };

  return ControlsConfig;
};

插入:

try {
    var step1 = await Step.create({ /*bla bla*/ });        
    var control1 = await Control.create({ /*bla bla*/ });    
    var OK = await control1.addStep(step1, {through: { config: 'THIS FIELD ALWAYS APPEARS NULL' }});
  } catch (error) { /* No errors*/ }

我正在遵循documentation

所述的相同策略
//If you want additional attributes in your join table, you can define a model for the join table in sequelize, before you define the association, and then tell sequelize that it should use that model for joining, instead of creating a new one:

const User = sequelize.define('user', {})
const Project = sequelize.define('project', {})
const UserProjects = sequelize.define('userProjects', {
    status: DataTypes.STRING
})

User.belongsToMany(Project, { through: UserProjects })
Project.belongsToMany(User, { through: UserProjects })

//To add a new project to a user and set its status, you pass extra options.through to the setter, which contains the attributes for the join table

user.addProject(project, { through: { status: 'started' }})

1 个答案:

答案 0 :(得分:0)

您必须将edit: true传递给addProject和addStep方法。

看到this答案,它也有类似问题

Sequelize belongsToMany additional attributes in join table