Sequelize——如何获得关联的模型

Sequelize — how to get associated model?

本文关键字:模型 关联 何获得 Sequelize      更新时间:2023-09-26

我有两个相关的模型(为清晰起见简称)

const model = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
      fullName: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
          notEmpty: true,
          len: [1,255]
        }
      }
    },
    {
      classMethods: {
        associate: function(models) {
          User.hasMany(models.Meeting, {as: 'chairedMeetings', foreignKey: 'chairmanId'})
        }
      }
    }
  )
  return User
}

const model = (sequelize, DataTypes) => {
  const Meeting = sequelize.define('Meeting', {
      title: {
        type: DataTypes.STRING,
        allowNull: false,
        validate: {
          notEmpty: true,
          len: [1,255]
        }
      }
    }, {
      classMethods: {
        associate: function(models) {
          Meeting.belongsTo(models.User, {as: 'chairman'})
        }
      }
    }
  )
  return Meeting
}
module.exports = model

我创建了一个新的会议,给定一个之前创建的用户id = 1,如下所示:

const data = {
  title: 'Some amazing meeting title',
  chairmanId: 1
}
Meeting.create(data, {include: [{all: true, nested: true}]}).then(meeting => {
  const chairmanId = meeting.get('chairmanId') // ===> this is 1 as expected
  const chairman = meeting.get('chairman')     // ===> but this is undefined
}

我如何获得序列化以返回关联的记录,而无需手动通过id进行关联和findOne ?

我明白了:

解决方案是在创建后执行reload

Meeting.create(data, {include: [{all: true, nested: true}]}).then(meeting => {
  const chairmanId = meeting.get('chairmanId') // ===> this is 1 as expected
  meeting.reload({include: [{all: true, nested: true}]}).then(reloadedMeeting => {
    const chairman = reloadedMeeting.get('chairman') // ===> is a user!
  })
}

我猜sequelize在创建后不会自动重新加载以防你从未真正关心你刚刚创建的模型,你只想知道它被保存了