Sequelize:实例方法getParticipants()中的'findAll'?

时间:2017-04-20 12:32:38

标签: node.js sequelize.js models instance-methods

我的会议实例方法规范:

  

getParticipants():承诺 - >参与者数组

会议模式:

return sequelize.define('conference', {

    id: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true
    },

    name: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true
    },

    maxParticipants: {
        type: Sequelize.INTEGER,
        allowNull: false
    },

    fileShareSession: {
        type: Sequelize.STRING,
        defaultValue: null,
        allowNull: true
    },

    startDate: {
        type: Sequelize.DATE,
        defaultValue: null,
        allowNull: true
    },

    endDate: {
        type: Sequelize.DATE,
        defaultValue: null,
        allowNull: true
    },

    state: {
        type: Sequelize.ENUM(
            ConferenceState.new,
            ConferenceState.starting,
            ..
        ),
        defaultValue: ConferenceState.new,
        required: true,
        allowNull: false
    }

参与者模型:

return sequelize.define('participant', {

    id: {
        type: Sequelize.UUID,
        defaultValue: Sequelize.UUIDV4,
        primaryKey: true
    },

    displayName: {
        type: Sequelize.STRING,
        defaultValue: null,
        allowNull: true
    },

    mediaResourceId: {
        type: Sequelize.STRING,
        defaultValue: null,
        allowNull: true
    },

    screenSharingId: {
        type: Sequelize.STRING,
        defaultValue: null,
        allowNull: true
    },

    mediaType: {
        type: Sequelize.ENUM(
            MediaType.AUDIO_VIDEO),
        defaultValue: MediaType.AUDIO_VIDEO,
        allowNull: false
    },

    state: {
        type: Sequelize.ENUM(
            ParticipantState.new,
            ParticipantState.joining,
            ..
        ),
        defaultValue: ParticipantState.new,
        required: true,
        allowNull: false
    }

问题:

那么我可以在我的会议实例模型中执行 participant.findAll 吗?如果是,我是否使用findAll获取数组?

我会这样做的:

// getParticipants() : Promise -> Participant array
      getParticipants() {
          return new Promise((resolve, reject) => {
              var Participant = sequelize.models.participant;
              Participant.findAll({
                  where: {
                      id: id
                  }
              }).then(function(participant) {
                  if (_.isObject(participant)) {
                      resolve(participant);
                  } else {
                      throw new ResourceNotFound(conference.name, {id: id});
                  }
              }).catch(function(err) {
                  reject(err);
              });
          });
      },

1 个答案:

答案 0 :(得分:2)

当你在表之间建立关系时,通过sequelize实现LAZY加载。你可以建立如下关系:

var Conference = sequelize.define('conference', { ... });

var Participant = sequelize.define('participant', { ... });

Conference.belongsToMany(Participant, { through: 'ConferenceParticipants'});

Participant.belongsToMany(Conference, { through: 'ConferenceParticipants'});

然后,当您查询数据库时,可以实现EAGER加载:

// Obtain the participant list included in the original object (EAGER)
var conference = 
 Conference.findOne({ 
    attributes: ['field1', 'field2', ...],
    where: {title: 'Conference A'},
    includes: [{
      attributes: ['field1', 'field2', ...],
      model: Participant,
      through: { model: 'ConferenceParticipants'} // You have to name the join table
    }]
  })
  .then(function(conference) {
      // Here you will have the conference with the list of participants

  });

如果你想使用LAZY加载,sequelize为你实现它,你只需要调用以下方法:

// Obtain the participant LAZY
conference.getParticipants().then(function(participants) {
  // participants is an array of participant
})

// You can also pass filters to the getter method.
// They are equal to the options you can pass to a usual finder method.
conference.getParticipants({ where: 'id > 10' }).then(function(participants) {
  // participants with an id greater than 10 :)
})

// You can also only retrieve certain fields of a associated object.
conference.getParticipants({attributes: ['title']}).then(function(participants) {
    // retrieve participants with the attributes "title" and "id"
})

您可以在下一个document中获得对续集关系实施的引用。