Sequelalizzare, problema di far tornare le associazioni
-
28-10-2019 - |
Domanda
Attualmente sto sperimentando sequelis e ho due oggetti, a Person
e Position
, Quando ricevo un elenco di persone, voglio ottenere la loro posizione.
Modelli:
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'});
La mia domanda:
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
});
});
Guardando il registro non chiede mai domande Person
affatto. Devo usare querychaining? Dalla documentazione sono stato in grado di scoprire che è apparso che avrebbe dovuto recuperare auto.
Soluzione
Ok qui un esempio completo su come risolvere il tuo problema (e sì, è una schifezza):
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
})
})
})
Questo otterrà prima tutti gli utenti, quindi otterrà la posizione di ciascun utente e li salverà in _User-Array. Successivamente rende la pagina. Non è testato ma dovrebbe fare il trucco.
Altri suggerimenti
Da aprile 2013 in v1.7.0 devi solo espandere il tuo Associazioni a:
Position.hasMany(User, {foreignKey : 'position_id', as: 'User'});
User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});
e poi trova tutti gli utenti con posizioni associate
User.findAll({
include: [{
model: Position, as: 'Posit'
}]
}).success(function(match) {
// your logic
});
Da quando ho riscritto sequelumi per 1.0 ho rimosso il supporto delle fetchassociazioni. Lo aggiungerò nelle prossime settimane. Ma diamo un'occhiata al tuo codice:
Stai usando nomi di colonne da sottolineaggio, quindi probabilmente si desidera utilizzare l'opzione di sottolineatura per le colonne generate automaticamente: http://www.sevelizejs.com/?active=usage#usage -> Scorri un po 'verso il basso o cerca sottolinearsi. Questo potrebbe farti salvare le opzioni per BelnetSto/Hasmany.
Quello che vuoi fare con Findall è Smth. come questo:
User.findAll().on('success', function(users) {
// asd
})
E come ho appena notato ... è un po 'difficile ottenere tutti gli oggetti associati: D così tanto per ora. Spero che ciò abbia aiutato.
Ciò consente di serializzare un JSON per un'azione ovunque su un modello. Leggilo, molto bene, penso che sia il modo migliore
// 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();