2017-04-20 3 views
0

Spezifikation für meine Konferenz Instanzmethode:Sequelize: 'findAll' in der Instanzmethode getParticipants()?

getParticipants(): Versprechen -> Teilnehmer Array

Conference Modell:

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 
    } 

Modell Teilnehmer:

Frage:

So kann ich ein participant.findAll in meinem Conferencing Instanz Modell oder nicht? Wenn ja, bekomme ich ein Array mit einem findAll zurück?

Ich würde es so getan haben:

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

Antwort

2

verzögertes Laden von sequelize implementiert wird, wenn Sie Beziehungen zwischen Tabellen zu machen. Sie könnten eine Beziehung machen, wie folgt:

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

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

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

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

Dann können Sie EAGER Laden implementieren, wenn Sie Ihre Datenbank abfragen wie:

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

    }); 

Wenn Sie verzögertes Laden verwenden, sequelize es implementieren für Sie, Sie müssen nur unten Methoden aufrufen:

// 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" 
}) 

Sie einen Verweis bekommen Beziehung Umsetzung in der nächsten document sequelize.