【问题标题】:Sequelize, store an object along with child (associated) object续集,将对象与子(关联)对象一起存储
【发布时间】:2015-01-25 09:46:19
【问题描述】:

我已经从续集创建了我的模型。我有一个作为地址对象附加的用户模型。链接定义如下:

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,但我被困在如何正确存储子(关联)对象上。

【问题讨论】:

  • 根据那个声明不应该是Address: [{street: "somestreet"}]吗?许多,而不是一个。
  • @JanR 你能用上面写的代码创建子实例吗??
  • 是的,请确保将其作为数组传入 [ ]

标签: node.js express sequelize.js


【解决方案1】:

你也可以像这样使用include关键字:

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

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

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

【讨论】:

    【解决方案2】:

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

    这解决了它:

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

    【讨论】:

    • 为了让这个对我有用,我必须运行这个:User.Address = User.hasMany(Address);,并使用包含选项:User.create(user, { include: [models.address] })
    【解决方案3】:

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

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

    我假设您的User 模型有一个主键userId。否则将下面示例中的 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?
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 2015-12-01
      相关资源
      最近更新 更多