2016-09-23 13 views
9

İki tür için çok sayıda ilişki içeren Oyuncu ve Ekip için modeller ve geçişler oluşturuyorum. Sıralı model kullanıyorum: oluştur, ancak yabancı anahtarların nasıl belirtileceğini veya tablolara nasıl ekleneceğini görmüyorum.Dışa aktarma veya sequelize-cli ile yabancı anahtarlar ile birleştirme tablosu oluşturma

sequelize model:create --name Player --attributes "name:string" 
sequelize model:create --name Team --attributes "name:string" 

Model oluşturulduktan sonra ilişkilendirmeler ekliyorum. Player'da : Takımı ise

Player.belongsToMany(models.Team, { through: 'PlayerTeam', foreignKey: 'playerId', otherKey: 'teamId' }); 

: Sonra göçler Player ve Ekibi için masalar vardır ama tablo (ne de yabancı anahtarları katılmak hiçbir orada

sequelize db:migrate 

ile çalıştırılır

Team.belongsToMany(models.Player, { through: 'PlayerTeam', foreignKey: 'teamId', otherKey: 'playerId' }); 

) veritabanında. Yabancı anahtarlar ve birleştirme tablosu nasıl oluşturulabilir? Bunun nasıl yapılacağı konusunda kesin bir rehber var mı?

cevap

9

Ben de sizin gibi aynı soruyu araştırdım, aradım ama şans yok. Yaptığım şey buydu ve kodunuzu izleyerek değiştirdim. Birleştirme tablosu için el ile geçiş oluşturuyorum. Ve her iki yabancı anahtar için bileşik indeksi ekliyorum.

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