续集,让协会返回的问题

我目前正在试验Sequelize,并有两个对象,一个人和一个Position ,当我得到一个人名单时,我想得到他们的位置。

楷模:

 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'}); 

我的查询:

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

看着日志,它永远不会查询Person 。 我需要使用queryChaining吗? 从文档中,我能够发现它应该自动获取关联。

在这里确定一个完整的例子如何解决你的问题(是的,这是废话):

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

这将首先获得所有用户,然后获取每个用户的位置并将其保存在_users-array中。 之后它呈现该页面。 它没有testing,但应该做的伎俩。

从2013年4月的v1.7.0开始,您只需要将您的关联扩展到:

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

然后find所有具有相关职位的用户

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

因为我重写了1.0的续集,我删除了fetchAssociations的支持。 我将在接下来的几周内添加它。 但让我们来看看你的代码:

您正在使用类似下划线的列名称,因此您可能希望对自动生成的列使用下划线选项: http : //www.sequelizejs.com/? active= usage#usage – >向下滚动或search下划线。 这可能为您省去了belongsTo / hasMany的选项。

你想用findAll做什么是平等的。 喜欢这个:

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

正如我刚才注意到的那样,获取所有关联的对象有点棘手:D现在这么多。 希望有所帮助。

这允许序列化一个JSON的模型的任何地方行动。 仔细阅读,我认为这是最好的方法

sequelize虚字段

 // 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();