Sequelize, problème pour obtenir des associations de retour
-
28-10-2019 - |
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.
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
// 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();