2017-04-20 100 views
0

規範我的會議實例方法:Sequelize:實例方法getParticipants()中的'findAll'?

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

回答

2

延遲加載由sequelize當你做表之間的關係來實現。你可以做一個關係如下:

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

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

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

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

然後你就可以實現預先加載,當你查詢你的數據庫,如:

// 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 

    }); 

如果您想使用延遲加載,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" 
}) 

你可以得到一個參考sequelize在明年document關係的實現。