typescript TypeORM:更新项目并返回

omjgkv6w  于 2022-11-26  发布在  TypeScript
关注(0)|答案(4)|浏览(301)

据我所知,最好的做法是在更新后返回一个项。TypeORM的updateById返回void,而不是更新后的项。
我的问题:是否可以在单行中更新并返回已修改的物料?
到目前为止,我尝试了:

await this.taskRepository.updateById(id, { state, dueDate });
return this.taskRepository.findOne({ id });

我在寻找:

return this.taskRepository.updateById(id, { state, dueDate }); // returns updated task
ecbunoof

ecbunoof1#

我刚刚发现我可以用.save方法来实现这一点:

return this.taskRepository.save({
    id: task.id,
    state,
    dueDate
});

根据文档(第save节),也支持部分更新:
由于跳过了所有未定义的属性,因此还支持部分更新。

5jvtdoz2

5jvtdoz22#

下面是我对Sandrooco的回答的进一步阐述:

const property = await this.propertyRepository.findOne({
  where: { id }
});

return this.propertyRepository.save({
  ...property, // existing fields
  ...updatePropertyDto // updated fields
});
plicqrtu

plicqrtu3#

该键返回response.raw[0]以取回类型。

虽然我希望await Table.update({}, {})返回Table,但它并没有返回。我发现使用QueryBuilder更容易,因为它总体上给了我更多的控制,但是如果你不喜欢QueryBuilder * 或者不需要它 *,你可以这样做:

const post = await Post.update({id}, {...input}).then(response => response.raw[0]);
// or
const post = (await Post.update({id}, {...input})).raw?.[0];

return post; // returns post of type Post

但是如果你想使用QueryBuilder,我建议你使用下面的方法。上面的其他人已经提到了RepositoryTable.save()的用法,它们在任何地方都不会返回原始的type,所以这种方法对我来说是不可能的。
Table.update({}, {})的示例:

@Mutation(() => PostResponse, { nullable: true })
@UseMiddleware(isAuthorized)
async updatePost(
  @Arg("id", () => Int) id: number,
  @Arg("input") input: PostInput,
  @Ctx() { req }: Context
): Promise<PostResponse | null> {
  // ...
  const post = await Post.update({id}, {...input}).then(response => response.raw[0]);
  return { post };
}

QueryBuilder的示例:

@Mutation(() => PostResponse, { nullable: true })
@UseMiddleware(isAuthorized)
async updatePost(
  @Arg("id", () => Int) id: number,
  @Arg("input") input: PostInput,
  @Ctx() { req }: Context
): Promise<PostResponse | null> {
  // ...
  const post = await getConnection()
    .createQueryBuilder()
    .update(Post)
    .set({ ...input })
    .where('id = :id and "creatorId" = :creatorId', {
      id,
      creatorId: userId,
    })
    .returning("*")
    .execute()
    .then((response) => {
      return response.raw[0];
    });

  return { post };
}

Helper函数 (如果您不想一直编写response.raw[0]

const typeReturn = async <T>(mutation: Promise<UpdateResult | DeleteResult | InsertResult>): Promise<T> => {
  return (await mutation).raw[0];
};

用法:

const update = await typeReturn<Post>(Post.update(...));
const insert = await typeReturn<Attachment>(Attachment.insert(...));
const del    = await typeReturn<User>(User.delete(...));
  • 注意:我在这里使用的是TypeORM和Type-GraphQL。*
  • .returning("*")不适用于MySQL,请参阅下面的注解。*
bfnvny8b

bfnvny8b4#

一种方法是执行更新,然后根据指定的条件执行查找

相关问题