代码之家  ›  专栏  ›  技术社区  ›  Brad

生成实例,保存并与一个查询关联

  •  3
  • Brad  · 技术社区  · 6 年前

    我在用 .build 创建模型实例,稍后保存。

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

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

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

    我发现如果我打电话 .setParent() 之前 .save()。 ,那是一个空的 SomeModel 将记录放入数据库。因此,我必须打电话给 .save()。 第一。但是,这需要两个查询。

    我怎么用 .build() / .save()。 具有 .set<x> 在单个查询中?

    1 回复  |  直到 6 年前
        1
  •  2
  •   PhilippeAuriach    6 年前

    如果您的父级尚未保存,您可以同时保存它,方法如下:

    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() 然后检索它,这将导致第二个请求。