Как создать таблицу соединений с внешними ключами с помощью sequelize или sequelize-cli
Я создаю модели и миграции для двух типов, игрока и команды, у которых много отношений. Я использую sequelize model: create, но не вижу, как указать внешние ключи или таблицы соединений.
sequelize model:create --name Player --attributes "name:string"
sequelize model:create --name Team --attributes "name:string"
после создания модели я добавляю ассоциации. В Игроке:
Player.belongsToMany(models.Team, { through: 'PlayerTeam', foreignKey: 'playerId', otherKey: 'teamId' });
В Команды:
Team.belongsToMany(models.Player, { through: 'PlayerTeam', foreignKey: 'teamId', otherKey: 'playerId' });
затем миграции выполняются с
sequelize db:migrate
есть таблицы для игрока и команды, но нет таблицы соединения (ни внешних ключей) в базе данных. Как можно создать внешние ключи и таблицу join? Есть подробное руководство, как это сделать?
1 ответов
У меня также есть тот же вопрос, как и у вас, я искал, но не повезло. Это то, что я сделал, и я изменяю, следуя вашему коду. Я создаю миграцию для таблицы join вручную. И я добавляю составной индекс для обоих внешних ключей.
module.exports = {
up: function(queryInterface, Sequelize) {
return queryInterface.createTable('PlayerTeam', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
playerId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'Player',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
teamId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'Team',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
}).then(() => {
// Create Unique CompoundIndex
let sql = `CREATE UNIQUE INDEX "PlayerTeamCompoundIndex"
ON public."PlayerTeam"
USING btree
("playerId", "teamId");
`;
return queryInterface.sequelize.query(sql, {raw: true});
});
},
down: function(queryInterface, Sequelize) {
return queryInterface.dropTable('PlayerTeam');
}
};