乐闻世界logo
搜索文章和话题

如何在 TypeORM 中使用 QueryBuilder 更新具有关系的实体

4 个月前提问
2 个月前修改
浏览次数35

1个答案

1

在TypeORM中使用QueryBuilder来更新具有关系的实体是一个比较高级的操作,需要确保你理解了TypeORM中关系的管理和QueryBuilder的使用。下面我将通过一个具体的例子来展示如何进行这样的操作。

假设我们有两个实体:UserProfile。其中 User 实体与 Profile 实体之间是一对一的关系。User 实体的定义如下:

typescript
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm"; import { Profile } from "./Profile"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToOne(() => Profile, profile => profile.user) @JoinColumn() profile: Profile; }

Profile 实体的定义如下:

typescript
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from "typeorm"; import { User } from "./User"; @Entity() export class Profile { @PrimaryGeneratedColumn() id: number; @Column() age: number; @OneToOne(() => User, user => user.profile) user: User; }

现在假设我们想要更新一个用户的名字和他的年龄。首先,我们需要加载这个用户和他的档案,然后更新它们。这里是如何使用QueryBuilder来实现这个目标:

typescript
import { getConnection } from "typeorm"; async function updateUserAndProfile(userId: number, newName: string, newAge: number) { const connection = getConnection(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { // 更新用户的名字 await queryRunner.manager .createQueryBuilder() .update(User) .set({ name: newName }) .where("id = :id", { id: userId }) .execute(); // 更新用户的年龄 await queryRunner.manager .createQueryBuilder() .update(Profile) .set({ age: newAge }) .where("userId = :userId", { userId: userId }) .execute(); await queryRunner.commitTransaction(); } catch (err) { // 如果遇到错误,进行回滚 await queryRunner.rollbackTransaction(); throw err; } finally { // 释放查询运行器 await queryRunner.release(); } }

这个例子中,我们首先创建了一个查询运行器,用于管理事务。我们对用户的name和用户的档案age分别进行了更新。注意我们使用userId作为Profile更新的条件,这是因为在Profile实体中有一个userId外键指向User实体。

务必保证在操作过程中处理好事务,确保数据的一致性。如果在更新过程中发生任何错误,我们回滚事务,以避免数据的部分更新导致的问题。

这只是一个简单的例子,实际应用中可能还需要处理更复杂的关系和更多的细节。

2024年7月3日 22:15 回复

你的答案