it is possible to define two foreign keys as a composite primary key of a model?
A user can only be a member of one family, a family can have many members and the fa
In fact, almost I got the solution from documentation:
User = sequelize.define('user', {});
Project = sequelize.define('project', {});
UserProjects = sequelize.define('userProjects', {
status: DataTypes.STRING
});
User.belongsToMany(Project, { through: UserProjects });
Project.belongsToMany(User, { through: UserProjects });
By default the code above will add projectId and userId to the UserProjects table, and remove any previously defined primary key attribute - the table will be uniquely identified by the combination of the keys of the two tables, and there is no reason to have other PK columns.
Source
For anyone looking to create a composite index primary key based of the columns(keys) in your join table when doing migrations. You will need to add a primary key constraint for the two columns that you wish to act as the combined primary key for the table.
module.exports = {
up: function (queryInterface, Sequelize) {
return queryInterface.createTable('itemtags', {
itemId: {
type: Sequelize.INTEGER,
references: {
model: 'items',
key: 'id',
},
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
allowNull: false
},
tagId: {
type: Sequelize.INTEGER,
references: {
model: 'tags',
key: 'id',
},
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
allowNull: false
}
})
.then(() => {
return queryInterface.addConstraint('itemtags', ['itemId', 'tagId'], {
type: 'primary key',
name: 'gametag_pkey'
});
});
},
down: function (queryInterface, Sequelize) {
return queryInterface.dropTable('gametags');
}
};
Which is roughly the same as doing ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);
in postgres.