当在同一模型上使用多个`belongsTo`时,Sequelize关联不以`{include:all}`返回

时间:2019-06-18 11:34:07

标签: sequelize.js

我有一个既有学生又有老师的约会模型。因此,老师有很多约会,学生有很多约会,约会通过引用相同模型的不同外键属于一位老师和一位学生。

  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一起使用。

2 个答案:

答案 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 }})