Как создать таблицу соединений с внешними ключами с помощью 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');
  }
};