据我所知,使用Sequelizejs,似乎没有办法在保存对象本身时保存对象关联。
例如,我有一个可以有1个或更多phoneNumber的联系人。目前我对这个协会有类似的东西:
global.db.Contact.hasMany(global.db.PhoneNumber, {as: 'phoneNumbers'});
使用休息端点我想发布一个新的联系人对象(带有任何提供的电话号码)并将其保存到数据库中。我的请求对象看起来像这样:
{
firstName: "john",
lastName: "Doe",
phoneNumbers: [
{ number: "555-555-5555", type: "home" }
]
}
现在我将此对象传递给build:
var contact = Contact.build(req.body);
然后调用save(我知道我可以使用create而不是build / save但是我们在save中有自定义逻辑来跟踪修改后的数据以及哪些用户进行了修改)
contact.save();
这引发了以下错误,这是有道理的。
column "phoneNumbers" of relation "Contacts" does not exist
sql调用正在尝试设置不存在的列“phoneNumbers”的值。我显然不希望它这样做...我真的希望用我正在创建的联系人的ID批量创建数组中的每个phoneNumber。
我发现的唯一例子是:https://gist.github.com/sdepold/3040391我真的不想这样做...因为我来自休息端点,我想要一种方法来执行此操作(我会有许多模型与协会)。我还需要能够批量执行这些操作(用于从其他源导入联系人),所以我希望它是最少量的sql调用。有没有人找到一个好方法呢?
答案 0 :(得分:0)
我使用此代码
var createUser = function(req, reply) {
db.User.create(req.payload).success(function(user) {
saveGroups(req, reply, user);
}).error(function(err) {
console.error('Error occured', err);
reply('Error');
});
};
var saveGroups = function(req, reply, user) {
db.UserGroup.destroy("user_id=" + user.id).success(function() {
var groups = req.payload.userGroups;
if (groups && groups.length > 0) {
for (var i = 0; i < groups.length; i++) {
groups[i].user_id = user.id;
}
db.UserGroup.bulkCreate(groups).success(function() {
reply(user);
}).error(function(err) {
console.error('Error occured', err);
reply('Error');
});
} else {
reply(user);
}
}).error(function(err) {
console.error('Error occured', err);
reply('Error');
});
};
答案 1 :(得分:0)
Sequelize v4引入了一项新功能,该功能允许创建一个实例以及任何关联的实例。
根据您的情况,它允许按如下所示针对单个用户添加多个电话号码。
return Contact.create({
firstName: 'John',
lastName: 'Doe',
PhoneNumbers: [
{
number: '555-555-5555',
type: 'home'
},
{
number: '555-555-7777',
type: 'work'
}
]
}, {
include: [{
association: Product.PhoneNumber
}]
});