【问题标题】:Sequelize - ORM - Associations not working已解决-续集-ORM-关联不起作用
【发布时间】:2020-10-20 21:50:07
【问题描述】:

在 MySQL 中使用 Sequelize。我有三个模型。顾问、家庭成员和任命。任命是指顾问和家庭成员。

我已经在 Appointment 模型中定义了外键。创建数据库时-外键可见-当我通过My​​SQL客户端检查约会表时。表名是冻结的 - 所以表名不可能复数。

顾问模特:

module.exports = (sequelize, DataTypes) => {
const consultant = sequelize.define('consultant', {
  ID: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false
  },
  FirstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  LastName: {
    type: DataTypes.STRING,
    allowNull: false
  }
{
  freezeTableName: true 
}
);

return consultant;
};

约会模式:

module.exports = (sequelize, DataTypes) => {
const appointment = sequelize.define('appointment', {
  // attributes
  ID: {
    type: DataTypes.UUID,
    primaryKey: true,
    allowNull: false
  },
  ConsultantID: {
    type: DataTypes.UUID,
    allowNull: false,
    references: {         
      model: 'consultant',
      key: 'ID'
    }
  },
  FamilyMemberID: {
    type: DataTypes.UUID,
    allowNull: false,
    references: {         
      model: 'familymember',
      key: 'ID'
    }
  }
}, 
{
  freezeTableName: true 
}
);

appointment.associate = function (models) {
  models.appointment.belongsTo(models.consultant, {
    foreignKey: 'ConsultantID',
    as: 'consultant',
  });
  models.appointment.belongsTo(models.familymember, {
    foreignKey: 'FamilyMemberID',
    as: 'familymember',
  });
};

return appointment;
};

家庭成员模型:

module.exports = (sequelize, DataTypes) => {
const familymember = sequelize.define('familymember', {
  // attributes
  ID: {
    primaryKey: true,
    type: DataTypes.UUID,
    allowNull: false
  },
  FamilyID: {
    type: DataTypes.UUID,
    allowNull: false
  },
  FirstName: {
    type: DataTypes.STRING,
    allowNull: false
  },
  LastName: {
    type: DataTypes.STRING,
    allowNull: false
  }
}, 
{
  freezeTableName: true 
}
);
return familymember;
};

然后在代码中我尝试获取约会并像这样获得相关的家庭成员和顾问

    var appointments = await Appointment.findAll({
        where: {
            AppointmentDateConfirmed: {
                $gte: moment().subtract(0, 'days').toDate()
              }
        }, include:[Consultant, FamilyMember]
    }
    )

但是我得到一个错误

UnhandledPromiseRejectionWarning: SequelizeEagerLoadingError: 顾问与预约无关!

【问题讨论】:

  • 显示一个代码,您可以在其中注册模型的所有关联。 Sequelize 似乎没有看到您的关联。
  • @Anatoly - 我无法很好地格式化评论。我已经更新了上面的主要查询 - 更新 2.0。它有我现在做的代码。

标签: mysql node.js sequelize.js associations


【解决方案1】:

我想您应该在模型注册后注册您的关联,就像我在 answer 中指出的那样

【讨论】:

  • 太棒了。马上试试。还找到了您的另一个答案 - 在这种情况下会有所帮助 similar scope 。我认为在我的情况下这也是必需的 - 因为我手动定义关联表并向其添加更多属性。
  • 我根据帖子 answer 进行了必要的更改 - 问题 - 更新 3.0 现在提供了 db.js 文件。接下来有错误。任何想法 - 它可能是什么?我尝试设置code db.sequelize = sequelize; db.Sequelize = 续集; code 在 fs 循环之前。但没有运气。
  • 您还应该将模型定义为函数,请参阅问题stackoverflow.com/a/61710568/1376618中的模型定义
  • 谢谢。刚做完。还移动了code Consultant.belongsToMany(FamilyMember, { through:ointment }) FamilyMember.belongsToMany(Consultant, { through:ointment }) 之前 -- code return 约会 - 在约会模型中,否则约会不能被发现。现在的错误是 belongsToMany 不是一个函数。
  • 请用更正的模型和关联更新主帖
猜你喜欢
  • 2020-01-21
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多