2011-06-15 30 views
8

我目前正在试验Sequelize,并有两个对象,一个是PersonPosition,当我得到一个人的列表,我想获得他们的位置。续集,问题得到协会返回

型号:

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吗?从文档中我发现它似乎应该自动获取关联。

回答

5

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

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-阵列。之后它呈现该页面。它没有测试,但应该做的伎俩。

+0

感谢这段代码,我会在这里稍微介绍一下 – 2011-06-16 12:08:26

+0

你的代码对我的帮助非常大。你有想法实现一个CustomEventEmitter?因为它甚至不在API中。 – lemon 2012-03-21 16:26:26

+0

实际上遇到麻烦,因为它不断返回填入最后输入用户的用户。 :| – lemon 2012-03-21 16:40:27

4

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

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

你想用findAll做什么是不合适的。像这样:

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

而且正如我刚才注意到......这有点棘手得到所有相关的对象:D这么多的现在。希望有所帮助。

+0

非常感谢您的答复。如果我正确理解你,在v1.0的sequelize中,目前没有获取关联对象的功能。感谢下划线的提示,我现在是对一个简单的,但已有的数据库的“概念验证”,我会把它记下来。 – 2011-06-15 20:30:35

+0

哦,有关联支持,但不是通过fetchAssociation。你可以做user.getPosition()。on('success',...我会稍后发布一个解决你的问题的解决方法 – sdepold 2011-06-16 04:48:00

+0

顺便说一下,我是sascha而不是sven:D你在哪里读过这个文件? – sdepold 2011-06-16 04:54:45

8

从2013年4月在V1.7.0你只需要扩大你的协会到:

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

,然后找到所有与用户相关的位置

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

谢谢你的男人!刚刚救了我的一天! – 2014-04-24 19:02:47

0

这允许序列化一个JSON任何关于模型的动作。读它,非常好,我认为这是最好的办法

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