2016-09-23 128 views
9

我正在爲兩種類型創建模型和遷移,即具有多對多關係的Player和Team。我使用sequelize模型:create,但沒有看到如何指定外鍵或連接表。如何使用外鍵創建連接表,並使用sequelize或sequelize-cli

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 

運行有對球員和團隊表,但沒有連接表(也不外鍵)在數據庫中。如何創建外鍵和連接表?有沒有關於如何做到這一點的權威指南?

回答

9

我也有像你一樣的問題,我搜索了,但沒有運氣。 這就是我所做的,我修改了下面的代碼。 我手動創建連接表的遷移。我爲兩個外鍵添加複合索引。

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'); 
    } 
};