Sequelize,将对象与子(关联)对象一起存储

时间:2014-11-26 22:08:33

标签: node.js express sequelize.js

我已经为sequelize创建了我的模型。我有一个附加为Address对象的User模型。链接定义如下:

User.hasMany(Address);

Address.belongsTo(User);

我想要存储的对象具有附加子项的正确结构:

{
      Username: "John",
      Email: "John@test.com",
      Address: [{
          street: "somestreet"
      }]
  };

当我尝试创建对象时,父项插入到我的数据库中,但是应用程序退出时[sequelize object]不包含方法.save()

我创建如下:

User.create(user).success(function(user){

});

我已经在我的sequelize实例上启用了日志记录,我可以看到为父对象生成了正确的sql,但我仍然坚持如何正确存储子(关联)对象。

3 个答案:

答案 0 :(得分:1)

我认为您不能像这样创建关联对象。

其他事项:您不应再使用成功处理程序。用户.then.catch.finally代替。

我假设您的userId模型有一个主键User。否则,请使用您的主键替换以下示例中的userId,该主键可能是Username

你应该这样做:

var user = {
    Username: "John",
    Email: "John@test.com"
};

User.create(user).then(function(user) {
    // sequelize passes the newly created object into the callback,
    // and we named the argument "user".
    // "user" is now a sequelize instance that has the association
    // methods of add[AS]. So we use it.

    var address = Address.build({
        street: "somestreet"
    };
    return user.addAddress(address);
}).then(function(address){
    //do something with address?
}).catch(function(err){
    //do something with your err?
});

有时候关联方法可能并不理想,原因很多,我在此不再赘述。很高兴知道这种替代方式,它只是使用新创建的用户实例的id来创建新地址:

User.create(user).then(function(user) {
    var address = {
        street: "somestreet"
        userId: user.userId
    }
    return Address.create(address);
}).then(function(address){
    //do something with address?
}).catch(function(err){
    //do something with your err?
});

答案 1 :(得分:1)

原来Wrikken的评论是正确的,我传递了一个唯一的对象,而不是一个数组。

这解决了它:

 {
      Username: "John",
      Email: "John@test.com",
      Address: [{
          street: "somestreet"
      }]
  };

答案 2 :(得分:0)

您还可以使用include关键字,如下所示:

const user = {
  Username: "John",
  Email: "John@test.com",
  Address: [
    {
      street: "somestreet"
    }
  ]
}

User.create(user, {
    include: [models.address]
})
.then((createdUser) => {
   // ...
})

其中models是一个包含所有Sequelize模型及其关联的对象。