Je suis en train d’expérimenter avec Sequelize et j’ai deux objects, une Person
et une Position
. Lorsque je veux obtenir la liste des personnes, je souhaite connaître leur position.
des 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 sortinged 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 ne demande jamais à Person
. Dois-je utiliser queryChaining? D’après la documentation que j’ai trouvée, il est apparu qu’il devrait extraire automatiquement les associations.
Ok, voici un exemple complet sur la façon de résoudre votre problème (et oui, c’est 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 }) }) })
Cela va d’abord récupérer tous les utilisateurs, puis obtenir la position de chaque utilisateur et les sauvegarder dans le tableau _users. Ensuite, il rend la page. Ce n’est pas testé mais devrait faire l’affaire.
À partir d’avril 2013 dans la version 1.7.0, il vous suffira d’étendre vos associations pour:
Position.hasMany(User, {foreignKey : 'position_id', as: 'User'}); User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});
puis trouver tous les utilisateurs avec des postes associés
User.findAll({ include: [{ model: Position, as: 'Posit' }] }).success(function(match) { // your logic });
depuis que j’ai réécrit sequelize for 1.0, j’ai supprimé le support de fetchAssociations. Je vais l’append dans les prochaines semaines. Mais regardons votre code:
Vous utilisez des noms de colonne de type trait de soulignement. Par conséquent, vous voudrez probablement utiliser l’option de soulignement pour les colonnes générées automatiquement: http://www.sequelizejs.com/?active=usage#usage -> faire défiler un peu ou rechercher un soulignement. . Cela pourrait vous faire économiser les options de ownTo / hasMany.
Ce que vous voulez faire avec findAll, c’est qch comme ça:
User.findAll().on('success', function(users) { // asd })
Et comme je viens de le remarquer … il est un peu difficile d’obtenir tous les objects associés: D Voilà pour le moment. J’espère que ça a aidé.
Cela permet de sérialiser un JSON pour une action n’importe où sur un modèle. Lisez-le, très bien, je pense que c’est la meilleure façon
sequelize-virtual-fields
// 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 + ')' } atsortingbutes: [ 'name' ], include: [ { model: Person, atsortingbutes: [ 'name' ] } ], order: [ ['name'], [ Person, 'name' ] ] } }); // define associations Task.belongsTo(Person); Person.hasMany(Task); // activate virtual fields functionality sequelize.initVirtualFields();