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

How to do cascading inserts with tables having auto increment id columns in TypeORM

4 个月前提问
3 个月前修改
浏览次数21

1个答案

1

在 TypeORM 中,级联插入是指在插入一个实体时,同时也自动插入其关联的其他实体。这在处理具有外键关系的表时非常有用。以下是一个具体的例子,展示了如何在表中使用具有自动递增 ID 列的级联插入。

假设我们有两个实体:UserProfile,用户(User)和其个人资料(Profile)之间存在一对一的关系。我们希望在创建一个新用户的同时,也能自动创建其对应的个人资料。这里的 User 是主表,拥有一个自动递增的 ID 列,而 Profile 是从表,含有一个外键指向 User

首先,我们需要定义这两个实体:

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

在这个例子中,User 实体中的 profile 属性使用了 @OneToOne 装饰器来指明 Profile 实体与之的一对一关系,并且通过 cascade: true 选项启用了级联插入操作。这意味着当我们创建并保存一个 User 实体时,与之关联的 Profile 实体也会被自动创建并保存。

接下来,我们可以写一个函数来创建一个新的用户和其个人资料:

typescript
import { createConnection, getRepository } from 'typeorm'; import { User } from './User'; import { Profile } from './Profile'; async function createUser() { const connection = await createConnection(/* 数据库配置 */); const userRepository = getRepository(User); const user = new User(); user.username = 'john_doe'; const profile = new Profile(); profile.bio = 'John Doe bio'; // 将个人资料与用户关联起来 user.profile = profile; // 保存用户,级联保存个人资料 await userRepository.save(user); console.log('新用户及其个人资料已创建:', user); await connection.close(); } createUser().catch(console.error);

在这个函数中,我们首先创建了一个 User 实体和一个 Profile 实体,并将 Profile 实体分配给了 User 实体的 profile 属性。由于我们启用了级联插入,调用 userRepository.save(user) 不仅会保存 User 实体,也会保存 Profile 实体。

这就是在 TypeORM 中对具有自动递增 ID 列的表进行级联插入的方式。通过正确地设置实体关系和级联选项,我们可以简化复杂数据的创建和维护过程。

2024年6月29日 12:07 回复

你的答案