如何使用 TypeORM 中的返回值进行更新?

Jer*_*L30 3 postgresql typeorm

我想使用 PostgreSQL 更新值并返回指定的列。

到目前为止,我发现更新值然后使用findOne,但它总是会使用两个查询来实现我想要的。

另一种是使用 RAW SQL,UPDATE ... SET ... WHERE ... RETURNING *这似乎是一个很好的解决方案,那么有没有办法使用 TypeORM 来实现这一点UpdateQueryBuilder

noa*_*ner 6

您可以使用createQueryBuilder

const firstUser = await connection
    .getRepository(User)
    .createQueryBuilder("user")
    .update<User>(User, {firstName: 'new first name'})
    .where("user.id = :id", { id: 1 })
    .returning(['id', 'email'])
    .updateEntity(true)
    .execute();
Run Code Online (Sandbox Code Playgroud)

注意:orm 类型中有多种使用createQueryBuilder 的方法,例如:BaseEntity, Repository, EntityManager

  • 您可以使用“BaseEntity”(下面的链接)扩展实体的类,并以这种方式实现它:“User.create(updateResult.raw[0])” https://github.com/typeorm/typeorm/blob/master/docs /active-record-data-mapper.md (3认同)

Bhu*_*ari 5

如果使用存储库,这是稍微修改过的答案,并受到诺姆答案的启发:

import {
  EntityRepository,
  Repository,
} from "typeorm";
import { User } from "../entities/user";

@EntityRepository(User)
export class UserRepository extends Repository<User> {
  
  // ... other functions

  updateUser = async (payload: User, id: string): Promise<User> => {
   const updatedData = await this.createQueryBuilder("user")
      .update<User>(User, { ...payload })
      .where("user.id = :id", { id: id })
      .returning("*") // returns all the column values
      .updateEntity(true)
      .execute();
    return updatedData.raw[0];
  };
}
Run Code Online (Sandbox Code Playgroud)