如何解决序列化,使关联返回问题
| 我目前正在尝试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
});
});
看着日志,它根本不会查询“ 0”。我需要使用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中。之后,它将呈现页面。它未经测试,但应该可以解决。
, 从2013年4月起,在v1.7.0中,您只需要将关联扩展到:
Position.hasMany(User,{foreignKey : \'position_id\',as: \'User\'});
User.belongsTo(Position,as: \'Posit\'});
然后找到所有具有相关职位的用户
User.findAll({
include: [{
model: Position,as: \'Posit\'
}]
}).success(function(match) {
// your logic
});
, 由于我重写了1.0的续集,因此取消了对fetchAssociations的支持。我将在接下来的几周内添加它。但是,让我们看一下您的代码:
您正在使用类似下划线的列名,因此您可能想对自动生成的列使用下划线选项:http://www.sequelizejs.com/?active=usage#usage->向下滚动或搜索下划线。这可以为您保存belongsTo / hasMany的选项。
您想对findAll进行的操作是smth。像这样:
User.findAll().on(\'success\',function(users) {
// asd
})
正如我刚注意到的那样,要获取所有关联的对象:D有点棘手。希望能有所帮助。
, 这允许序列化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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。