我目前正在尝试使用Sequelize并有两个对象,Person
和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吗?从文档中我发现它似乎应该自动获取关联。
答案 0 :(得分:8)
从2013年4月开始,您需要将关联扩展为:
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
});
答案 1 :(得分: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-array中。然后它呈现页面。它没有经过测试,但应该这样做。
答案 2 :(得分:4)
因为我重写了1.0的sequelize,我删除了fetchAssociations的支持。我将在接下来的几周内添加它。但是让我们来看看你的代码:
您使用的是类似下划线的列名,因此您可能希望对自动生成的列使用下划线选项:http://www.sequelizejs.com/?active=usage#usage - >向下滚动或搜索下划线。这可能会为您保存belongsTo / hasMany的选项。
你想用findAll做什么是smth。像这样:
User.findAll().on('success', function(users) {
// asd
})
正如我刚刚注意到的......获得所有相关对象有点棘手:D现在这么多。希望有所帮助。
答案 3 :(得分:0)
这允许序列化json以获取有关模型的任何操作。读它,非常好,我认为这是最好的方式
// 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();