11

据我所知,使用 Sequelizejs,似乎没有办法在保存对象本身时保存对象关联。

例如,我有一个联系人可以有 1 个或多个电话号码。目前我有这样的协会:

global.db.Contact.hasMany(global.db.PhoneNumber, {as: 'phoneNumbers'});

使用休息端点我想发布一个新的联系人对象(带有任何提供的电话号码)并将其保存到数据库中。我的请求对象看起来像这样:

{
    firstName: "john",
    lastName: "Doe",
    phoneNumbers: [
        { number: "555-555-5555", type: "home" }
    ]
}

现在我通过这个对象来构建:

var contact = Contact.build(req.body);

然后调用保存(我知道我可以使用创建而不是构建/保存,但我们在保存中有自定义逻辑来跟踪修改后的数据以及哪个用户进行了修改)

contact.save();

这会引发以下错误,这是有意义的。

column "phoneNumbers" of relation "Contacts" does not exist

sql 调用正在尝试设置不存在的列“phoneNumbers”的值。我显然不希望它这样做......我真的希望它使用我正在创建的联系人的 ID 批量创建数组中的每个 phoneNumber。

我发现的唯一例子是:https ://gist.github.com/sdepold/3040391我真的不想这样做......因为我来自休息端点,我想要一种方法一般执行此操作(我将有许多具有关联的模型)。我还需要能够批量执行这些操作(用于从其他来源导入联系人),因此我希望它是最少数量的 sql 调用。有没有人找到这样做的好方法?

4

2 回答 2

2

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

于 2019-08-25T21:15:40.807 回答
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');
    });
};
  • User 是一个具有许多 UserGroup 的模型
  • req.payload 来自 JSON
  • destroy(...) 在那里首先清空关联(以防我们进行更新)
于 2014-05-12T11:04:37.237 回答