如何build立表与Sequelize.js之间的多对多关系?

我想通过使用Sequelize.js来build立事件表和用户表之间的多对多关系。 用户可以参加更多的活动,一个活动可以有更多的参与者。 因此,我带了一个event_user的中间表,并创build了它的模型。

这里是所有的3个模型:

我的users_model.js:

var EventUser = require('./event_user_model.js'); //_______________________Init & Config Sequelize__________________ const Sequelize = require("sequelize"); const sequelize = new Sequelize('db', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } }); //____________Declare table structure ________________________ var User = sequelize.define('user', { id: { type: Sequelize.STRING, primaryKey: true, }, password: { type: Sequelize.STRING, }, email: { type: Sequelize.STRING }, user_id: { //Foreign Key. Do I even need to put it here at all? type: Sequelize.INTEGER, references: { model: "events_user", key: "user_id", } }, }, { freezeTableName: true }); //__________________Establish relationships with other tables_________ User.belongsTo(EventUser,{foreignKey:user_id}); //_____________________________________________________________________ User.sync({force:true}).then(function () { return User.create({ id:'ORD0', password: 'mypass', email: 'whatever@gmail.com', user_id:1 }); }).then(c => { console.log("User Created", c.toJSON()); }) .catch(e => console.error(e)); //______________________________________________________________________ module.exports = User; 

我的events_model.js:

 var EventUser = require('./event_user_model.js'); //______________Init & Config Sequelize_________ const Sequelize = require("sequelize"); const sequelize = new Sequelize('millesime_admin', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } }); //______________________Declare table structure __________________ var Event = sequelize.define('event', { eventid: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, date: { type: Sequelize.DATE }, title: { type: Sequelize.STRING, }, event_id: { //Foreign Key . Do I even need to put it here at all? type: Sequelize.INTEGER, references: { model: "event_user", key: "event_id" // Surely here I do something wrong!! } }, }, { freezeTableName: true }); //____________Establish relationships with other tables_________ Event.belongsTo(EventUser, {foreignKey: event_id}); //________________________Create table____________ Event.sync().then(function () { return Event.create({ eventid:1, title: 'Event1', date: new Date(24, 9, 2016), event_id: 1, }); }).then(c => { console.log("Created event", c.toJSON()); }).catch(e => console.error(e)); //________________________________________________________ module.exports = Event; 

和我的event_user_model.js:

 var User = require('./users_model.js'); var Event= require('./events_model.js'); //______________________________Initialize & Config Sequelize__________________ const Sequelize = require("sequelize"); const sequelize = new Sequelize('millesime_admin', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } }); //_______________Declare table structure ________________________ var EventUser = sequelize.define('eventuser', { eventuserid: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true, }, user_id: { type: Sequelize.INTEGER, references: { model: "users", key: "id", } }, event_id: { type: Sequelize.INTEGER, references: { model: "event", key: "eventid", } }, reservationConfirmation:{ type:Sequelize.BOOLEAN, }, attendance:{ type:Sequelize.BOOLEAN }, }, { freezeTableName: true }); //___________________Establish relationships with other tables_________ EventUser.hasMany(User, {foreignKey:id}); //EventUser.hasMany(Event, {forignKey:eventid}); //__________________________Create table_______________________ EventUser.sync( /*{force: true}*/ ).then(function () { return EventUser.create({ eventuserid:1, event_id:1, user_id: 1, reservationConfirmation: true, attendance: true }); }).then(c => { console.log("Created", c.toJSON()); }).catch(e => console.error(e)); //___________________________________________________ module.exports = EventUser; 

你做的第一个错误的事情是在每个模型文件中创build新的Sequelize实例。 您需要创build一个文件,在其中创buildsequelize实例,该实例将在每个模型定义文件中导入。 在你的情况下,结构可以如下

 - models - sequelize.js - event.js - user.js - eventUser.js 

而每个文件应该是这样的:

 // sequelize.js var Sequelize = require('sequelize'); var sequelize = new Sequelize( 'millesime_admin', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } } ); module.exports = sequelize; 

现在,当你创build了sequelize实例时,你可以定义模型

 // event.js var sequelize = require('./sequelize'); var Event = sequelize.define(...); module.exports = Event; // user.js var sequelize = require('./sequelize'); var User = sequelize.define(...); module.exports = User; 

现在,您可以创build最后一个模型的EventUser ,以及EventUser之间的多对多关系。 这个关系将在EventUser模型定义发生的eventUser.js文件中创build

 // eventUser.js var sequelize = require('./sequelize'); var User = require('./user'); var Event = require('./event'); var EventUser = sequelize.define(...); User.belongsToMany(Event, { through: EventUser } ); Event.belongsToMany(User, { through: EventUser } ); 

参见BelongsToMany mixin:“与连接表的多对多关联”。

例:

 UserProject = sequelize.define('user_project', { role: Sequelize.STRING }); User.belongsToMany(Project, { through: UserProject }); Project.belongsToMany(User, { through: UserProject }); 

看文档: