如何通过sequelize中的setAssociation选项在连接表中设置params?

时间:2016-02-08 08:00:06

标签: sequelize.js polymorphic-associations jointable

我已经通过名称labels_association定义了表的模式,它将标签和模型X关联起来如下:

'use strict';

module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('labels_association', {
      labelId: {
        allowNull: false,
        type: Sequelize.INTEGER
      },
      associationId: {
        allowNull: false,
        type: Sequelize.INTEGER
      },
      associationType: {
        allowNull: false,
        type: Sequelize.ENUM('x', 'y')
      }
    });
  },
  down: function(queryInterface) {
    return queryInterface.dropTable('labels_association');
  }
};

通过labels_association表

定义has并属于模型X与标签的许多关系
X.belongsToMany(Label, {
  as: 'labels',
  through: {
    model: 'labels_association',
    attributes: ['associationId', 'associationType'],
    scope: {
      associationType: 'x'
    }
  },
  foreignKey: 'associationId',
  otherKey: 'labelId'
});

虽然在为模型X的实例设置标签时,我无法将associationType设置为'x',而它应该已经由belongsToMany关联中的scope属性处理。

instanceOfX.setLabels(labelIds, {
  associationType: 'x'
})

如何在上面的场景中将associationType设置为值'x'?

1 个答案:

答案 0 :(得分:0)

参考Github上跟踪的此问题https://github.com/sequelize/sequelize/issues/5378

需要为关系表创建模型,如下所示:

let LabelAssociation = sequelize.define('labelAssociation', {
  associationType: {
    type: STRING
    // etc
  }
}, {
  tableName: 'label_associations'
});

X.belongsToMany(Label, {
  as: 'labels',
  through: {
    model: LabelAssociation,
    attributes: ['associationId', 'associationType'],
    scope: {
      associationType: 'x'
    }
  },
  foreignKey: 'associationId',
  otherKey: 'labelId'
});

说明如下:

  

字符串参数(belongsToMany选项中的through.model)专门用于定义表的名称   自动生成模型。如果您还没有为联接定义模型   模特,你需要是的,否则Sequelize并不知道这些   存在额外的属性。