我有一个既有学生又有老师的约会模型。因此,老师有很多约会,学生有很多约会,约会通过引用相同模型的不同外键属于一位老师和一位学生。
Appointment.associate = function (models) {
Appointment.Teacher = Appointment.belongsTo(models.Account, {
as: 'teacher',
foreignKey: 'teacherId'
});
};
Appointment.associate = function (models) {
Appointment.Student = Appointment.belongsTo(models.Account, {
as: 'student',
foreignKey: 'studentId'
});
};
如果我查询并包括所有关联,则不包括学生和老师:
const appointment = await db.Appointment.findOne({
where: { id: req.params.id },
include: { all: true }
});
如果我查询并专门指定关联,则会收到错误消息:
const appointment = await db.Appointment.findOne({
where: { id: req.params.id },
include: [{ model: db.Account, as: 'student' }, { model: db.Account, as: 'teacher' }]
});
// Gives me SequelizeEagerLoadingError: account is not associated to appointments!
这是一个错误还是我做错了什么?我还看到了其他一些与此相关的帖子,但仍然无法解决。我正在将sequelize 5.8.0与mysql一起使用。
答案 0 :(得分:1)
好吧...我想如果您要以这种方式查询它,您可能应该将其设置为hasOne而不是belongsTo .....在我看来,约会是父母,老师和学生是儿童关系。您是说,给我所有与此约会相关联的帐户。...但是然后说约会是Account的属性,而不是相反的方式...尝试将其切换,也许更像是这样...在该关联代码中,有些东西看起来很有趣
Appointment.associate = function (models) {
Appointment.hasOne(models.Teacher , {
as: 'teacher', foreignKey: 'teacher_id',
});
Appointment.hasOne(models.Student, {
as: 'sturdent', foreignKey: 'student_id',
});
}
我需要确认您的实际模型,但是我认为这会更近一些,您可能也必须使用sourceKey,但是我无法从代码段中得知
答案 1 :(得分:1)
像@GregBelyea一样,尝试将两个belongsTo()
调用合并到一个Appointment.associate
方法中。如所写,我认为第一个覆盖第二个(您可以通过仅包括学生来测试)。
我在下面尝试了简单的黑客测试,并且效果很好,显示了与老师和学生的会面。
Meeting.belongsTo(User, {as: 'teacher', foreignKey: 'teacher_id'});
Meeting.belongsTo(User, {as: 'student', foreignKey: 'student_id'});
Meeting.findAll({include: { all: true }})