关键是返回response.raw[0]
以获取类型。
虽然我希望 await Table.update({}, {})
返回 Table
,但实际上它并不会。我发现使用 QueryBuilder
更容易控制,但是如果你不喜欢 QueryBuilder
或者不需要它,你可以像这样做:
const post = Post.update({id}, {...input}).then(response => response.raw[0]);
const post = (await Post.update({id}, {...input})).raw[0];
return post;
如果您确实想使用
QueryBuilder
,我建议采用以下方法。
其他人已经提到了
Repository
和
Table.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> {
Post.createQueryBuilder()
.update(Post)
.set({ ...input })
.where('id = :id and "creatorId" = :creatorId', {
id,
creatorId: userId,
})
.returning("*")
.execute()
.then((response) => {
return response.raw[0];
});
return { post };
}
辅助函数(如果您不想一直编写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。
在 MySQL 上,
.returning("*")
不起作用,请参见下面的评论。
..task
变量的展开,这个变量突然出现并不在原问题中;而在原问题中你使用的是id
。 - aborted.save
会在实体不存在时创建一个新实体。这可能不总是希望发生的情况。因此,.update
将是一个更明智的选择,然后仍要执行.findOne(id: task.id)
返回整个对象。 - DarkLite1.save
来更新实体时,如果你使用{...oldEntity, ...updates}
,这个方法并没有返回实体本身,而只是一个普通的对象。这可能会对class-serializer
造成问题。 - Baterka