构建实例,保存并与一个查询关联

时间:2018-06-25 17:27:36

标签: sequelize.js

我正在使用.build创建一个模型实例,以后将其保存。

const modelInstance = sequelize.models.SomeModel.build({
  someKey: 'someValue',
  // ...
});

有条件地添加各种属性之后,我叫.save(),然后将记录与另一个模型相关联。

modelInstance.save().then((modelInstance) => {
  modelInstance.setParent(parentInstance);
});

我发现,如果我在.setParent()之前调用.save(),则会将一个空的SomeModel记录放入数据库中。因此,我必须先致电.save()。但是,这需要两个查询。

如何在单个查询中将.build().save()一起使用?

1 个答案:

答案 0 :(得分:2)

如果您的父母尚未保存,则可以通过以下方式同时保存它:

return SomeModel.create({
  someKey: 'someValue',
  parent: {
    parentKey: 'parentValue'
  }
}, {
  include: [{
    association: ParentModel
  }]
});

如果父实例已经保存(例如来自findOne的实例),那么您的解决方案是正确的。只是一件事:您可能应该返回第二个承诺:

modelInstance.save().then((modelInstance) => {
  return modelInstance.setParent(parentInstance);
});

如果父实例存在并且您确实不想发出这两个请求,则也许您可以弄清楚如何建立关联,而不必进行后续处理。例如,如果关联是由父级的外键定义的,则可以这样保存:

return SomeModel.create({
  someKey: 'someValue',
  parentId: parentInstance.id
});

但是,当然,这意味着返回的对象不包含父属性,您必须在检索之后进行getParent()的操作,这将导致第二次请求。