【问题标题】:Sequelize: 'findAll' in instance method getParticipants()?续集:实例方法getParticipants()中的'findAll'?
【发布时间】:2017-09-17 02:18:09
【问题描述】:

我的会议实例方法的规范:

getParticipants() : Promise -> 参与者数组

会议模型:

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);
              });
          });
      },

【问题讨论】:

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


    【解决方案1】:

    在表之间建立关系时,通过 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 中获得对 sequelize 关系实现的参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多