Question

J'expérimente actuellement avec Sequelize et ont deux objets, un Person et Position Quand obtenir une liste des personnes que je veux obtenir leur position.

modèles:

var User = sequelize.define('user', {
    first_name: Sequelize.STRING,
    last_name: Sequelize.STRING 
});

var Position = sequelize.define('position', {
    name: Sequelize.STRING,
    affiliation: Sequelize.STRING
});

Position.hasMany(User, { foreignKey : 'position_id' });
User.belongsTo(Position, { foreignKey : 'position_id'});

Ma requête:

User.findAll({ fetchAssociations: true }, function(results) {
    //I've tried doing some work in here, but haven't found the correct procedure. 
}).on('success', function(results) {
    res.render('users', {
        title: 'user page',
        users: results
    });
});

Regarder le journal interroge jamais Person du tout. Ai-je besoin d'utiliser queryChaining? De la documentation, j'ai pu trouver il est apparu qu'il devrait chercher des associations auto.

Était-ce utile?

La solution

Ok ici un exemple complet comment résoudre votre problème (et oui que de la merde):

User.findAll().on('success', function(users) {
  var chainer = new Sequelize.Utils.QueryChainer
    , _users  = []

  users.forEach(function(u) {
    var emitter = new Sequelize.Utils.CustomEventEmitter(function() {
      u.getPosition().on('success', function(pos) {
        _users.push({user: u, position: pos})
        emitter.emit('success')
      })
    })
    chainer.add(emitter.run())
  })
  chainer.run().on('success', function() {
    res.render('users', {
      title: 'user page',
      users: _users
    })
  })
})

Ce sera d'abord obtenir tous les utilisateurs, puis obtenir la position de chaque utilisateur et sauvegarder sur le _users-tableau. Par la suite, il rend la page. Il est non testé, mais devrait faire l'affaire.

Autres conseils

A partir de Avril 2013 à v1.7.0 vous avez juste besoin d'élargir votre Associations :

Position.hasMany(User, {foreignKey : 'position_id', as: 'User'});
User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});

et trouver tous les utilisateurs avec des positions associées

User.findAll({
      include: [{
        model: Position, as: 'Posit'
      }]
}).success(function(match) {
    // your logic
});

depuis que je Réécriture sequelize pour 1.0 je retire le soutien de fetchAssociations. Je vais l'ajouter dans les prochaines semaines. Mais nous allons jeter un oeil à votre code:

Vous utilisez underscore comme les noms de colonnes, de sorte que vous voulez probablement utiliser l'option underscore pour les colonnes générées automatiquement: http://www.sequelizejs.com/?active=usage#usage -> défilement un peu vers le bas ou rechercher underscore. Cela pourrait vous faire économiser les options pour belongsTo / hasMany.

Qu'est-ce que vous voulez faire avec findAll est lissée. comme ceci:

User.findAll().on('success', function(users) {
  // asd
})

Et comme je viens de remarquer ... il est un peu difficile à obtenir tous les objets associés: D Tant pour l'instant. Espoir qui a aidé.

Ceci permet sérialisation JSON pour l'action d'un modèle partout. Lisez, très bien, je pense que la meilleure façon est

sequelize-champs virtuels

// define models 
var Person = sequelize.define('Person', { name: Sequelize.STRING });
var Task = sequelize.define('Task', {
name: Sequelize.STRING,
nameWithPerson: {
    type: Sequelize.VIRTUAL,
    get: function() { return this.name + ' (' + this.Person.name + ')' }
    attributes: [ 'name' ],
    include: [ { model: Person, attributes: [ 'name' ] } ],
    order: [ ['name'], [ Person, 'name' ] ]
}
});

// define associations 
Task.belongsTo(Person);
Person.hasMany(Task);

// activate virtual fields functionality 
sequelize.initVirtualFields();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top