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

TypeORM 如何在没有加载关系的属性的情况下显式设置 ForeignKey ?

6 个月前提问
5 个月前修改
浏览次数27

1个答案

1

在使用TypeORM进行数据库操作时,有时我们需要直接设置外键(ForeignKey),而不需要加载整个关联的实体对象。这种情况通常出现在性能优化或者当相关实体的数据已知且仅需要设置外键而不需要其他字段数据时。

在TypeORM中,你可以通过直接访问实体的外键字段来设置外键,而不必加载关联的实体。每个外键关系通常都有一个对应的列装饰器(例如 @ManyToOne),你可以通过直接设置这个列的值来设置外键。

示例

假设我们有两个实体:UserPhoto。每个 Photo 属于一个 User,在 Photo 实体中,我们有一个 userId 字段作为外键:

typescript
@Entity() export class User { @PrimaryGeneratedColumn() id: number; @OneToMany(type => Photo, photo => photo.user) photos: Photo[]; } @Entity() export class Photo { @PrimaryGeneratedColumn() id: number; @ManyToOne(type => User, user => user.photos) user: User; @Column() userId: number; }

在上面的代码中,Photo 实体有一个 userId 字段作为外键指向 User。如果你知道用户的ID,而不需要加载 User 实体,你可以直接设置 userId

typescript
async function assignPhotoToUser(photoId: number, userId: number) { const photoRepository = getRepository(Photo); let photo = new Photo(); photo.id = photoId; photo.userId = userId; // 直接设置外键 await photoRepository.save(photo); }

在这个例子中,通过设置 userId 字段,我们无需加载 User 实体即可建立 PhotoUser 的关系。这种方法可以减少数据库操作的复杂性,并可能提高应用程序的性能。

注意事项

  • 确保在设置外键时,该ID确实存在于数据库中,否则可能会违反外键约束。
  • 使用此方法时,TypeORM将不会自动处理级联删除或更新。如果有需要,必须手动管理相关的数据库完整性。

使用这种方法可以灵活地处理数据库关系,特别是在处理大量数据和需要优化性能的场景中非常有用。

2024年6月29日 12:07 回复

你的答案