2016-09-23 10 views
9

多対多リレーションシップを持つPlayerとTeamという2つのタイプのモデルとマイグレーションを作成しています。私はsequelize modelを使用しています。作成しますが、外部キーを指定する方法やテーブルを結合する方法がわかりません。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' }); 

:次に移行は選手とチームのためのテーブルはありませんが、テーブル(や外部キーに加わる何があります

sequelize db:migrate 

で実行されている

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

)をデータベースに格納します。外部キーと結合表はどのように作成できますか?これを行う方法についての明確なガイドがありますか?

答えて

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