为调度应用程序添加模型关联

我正在开发一个应用程序来处理大型侦察兵营的程序调度。 我关心的主要模型是:

程序代表一个单独的程序活动(例如,皮划艇,山地自行车等等。这个模型有很多领域,没有一个与这个问题相关。

var Program = sequelize.define("Program", { name: { type: DataTypes.STRING, allowNull: false }, max_participants_per_period: DataTypes.INTEGER, [...bunch of other fields...] }, { underscored: true, classMethods: { associate: function(models) { Program.hasMany(models.ProgramPeriod); } } }); 

每个程序都安排在一个ProgramPeriod中。 ProgramPeriod有一个开始和结束时间。 不同的节目不同的时间(有些是半天,有些是全天等)。

 var ProgramPeriod = sequelize.define('ProgramPeriod', { start_at: DataTypes.DATE, end_at: DataTypes.DATE }, { underscored: true, classMethods: { associate: function(models) { ProgramPeriod.belongsToMany(models.Unit, { through: 'Schedule' }); ProgramPeriod.belongsTo(models.Program); } } }); 

一个单位是一群侦察员和领导。 一个单位将通过一个ProgramPeriod被安排到任何数量的Program中。 还有一些与这个问题无关的其他字段。

 var Unit = sequelize.define("Unit", { unit_number: { type: DataTypes.STRING, unique: true }, number_of_youth: DataTypes.INTEGER, number_of_leaders: DataTypes.INTEGER, }, { classMethods: { associate: function(models) { Unit.belongsToMany(models.ProgramPeriod, { through: 'Schedule', foreignKey: 'unit_id' }); } }, getterMethods: { total_participants: function() { return this.number_of_youth + this.number_of_leaders; } } }); 

图:

 ┌────────────────┐ ┌─────────────────────────┐ │ │ │ ProgramPeriod │ │ Program │ ╱│ pk: id(INT) │ │ pk: id(INT) │─Program.hasMany(ProgramPeriod)───│ fK: program_id(INT) │ │ │ ╲│ references Programs.id │ └────────────────┘ │ │ └─────────────────────────┘ ╲│╱ │ │ │ ProgramPeriod.belongsToMany(Unit, { through: Schedule }) │ │ │ ╱│╲ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ Schedule │ unit_id │ program_period_id │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ╲│╱ │ │ │ Unit.belongsToMany(ProgramPeriod, { through: Schedule }) │ │ │ ╱│╲ ┌─────────────────────────┐ │ │ │ Units │ │ pk: id(INT) │ │ │ │ │ └─────────────────────────┘ 

通过这个设置,我可以查询所有分配到ProgramPeriodUnit

 Program.find({ where: { id: 1 }, include: [{ model: models.ProgramPeriod, include: [ models.ProgramPeriod.associations.Schedule ] }] }); 

…我可以查询一个Unit的计划的时间表:

 Unit.find({ where: { id: 174 }, include: [{ model: models.ProgramPeriod, include: [ models.ProgramPeriod.associations.Program] }] }) 

我在计算一些安排所需的东西时遇到了麻烦。 假设单位ID 174有10个参与者。 对于任何给定的Program ,我需要查询有足够可用空间的所有ProgramPeriods ,并且不与本单元的时间表上的任何其他ProgramPeriod时间发生冲突。

我不受任何上述协会的约束。 我可以改变一下,如果这样做更容易。

谢谢!