在Sequelizejs中保存带有关联的对象

时间:2013-10-07 17:59:34

标签: sequelize.js

据我所知,使用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调用。有没有人找到一个好方法呢?

2 个答案:

答案 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');
    });
};
  • 用户是拥有多个用户组的模型
  • req.payload是一个JSON
  • destroy(...)首先清空关联(如果我们进行更新)

答案 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
  }]
});

详细文档可在此处找到Sequelize Docs - Creating with associations