我正在开发一个处理大型童子军阵营计划安排的应用程序。我关注的主要模型是:
计划代表个人计划活动(例如皮划艇,山地自行车等。此模型上有许多字段,其中没有一个与此问题相关。
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安排到任意数量的程序中。还有许多与此问题无关的其他字段。
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) │
│ │
│ │
└─────────────────────────┘
通过此设置,我可以查询分配给Unit
Program
的所有ProgramPeriod
:
Program.find({
where: { id: 1 },
include: [{ model: models.ProgramPeriod,
include: [ models.ProgramPeriod.associations.Schedule ]
}]
});
...我可以查询Unit
的{{1}}的日程安排:
Program
我无法搞清楚安排所需的一些事情。假设单元id 174有10个参与者。对于任何给定的Unit.find({
where: { id: 174 },
include: [{ model: models.ProgramPeriod,
include: [ models.ProgramPeriod.associations.Program]
}]
})
,我需要查询具有足够空间的所有Program
,并且不要与该单元上已有的任何其他ProgramPeriods
时间冲突。时间表。
我与以上任何协会都没有关系;如果它能让你更容易完成,我可以改变一切。
谢谢!