typeorm 多对多的增删改查
时间: 2023-09-01 18:07:43 浏览: 56
TypeORM 中实现多对多关系需要使用到 Entity 的 `@ManyToMany` 装饰器。假设我们有两个 Entity,分别是 `User` 和 `Role`,并且它们之间是多对多的关系,即一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。
首先,我们需要定义一个关联表用于存储 User 和 Role 的关系。这个关联表不需要单独定义,可以在其中一个 Entity 的 `@ManyToMany` 装饰器中指定关联表的名称和字段名。例如,我们可以在 User Entity 中定义如下的关联关系:
```typescript
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Role, role => role.users)
@JoinTable()
roles: Role[];
}
```
这里我们使用了 `@ManyToMany` 装饰器来定义与 Role Entity 的多对多关系,并且指定了关联表的名称和字段名。`@JoinTable` 装饰器用于指定关联表的名称和字段名,如果不指定,TypeORM 会自动生成一个默认的表名和字段名。
接下来,我们需要定义 Role Entity,它与 User Entity 的关系也是多对多的:
```typescript
@Entity()
export class Role {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => User, user => user.roles)
users: User[];
}
```
这里我们同样使用了 `@ManyToMany` 装饰器来定义与 User Entity 的多对多关系,并且指定了关联表的名称和字段名。
一旦我们定义好了多对多关系,我们就可以使用 TypeORM 提供的 Repository API 进行增删改查操作。例如,我们可以通过以下代码向数据库中添加一个用户和一个角色,并将它们关联起来:
```typescript
const userRepository = getConnection().getRepository(User);
const roleRepository = getConnection().getRepository(Role);
// 创建一个用户和一个角色
const user = new User();
user.name = 'Alice';
await userRepository.save(user);
const role = new Role();
role.name = 'Admin';
await roleRepository.save(role);
// 关联用户和角色
user.roles = [role];
await userRepository.save(user);
```
这里我们首先通过 `getRepository` 方法获取到 User 和 Role 的 Repository 实例,然后分别创建一个用户和一个角色,并将它们保存到数据库中。最后,我们将用户和角色关联起来,保存到数据库中。
如果我们想要查询某个用户的所有角色,可以通过以下代码实现:
```typescript
const user = await userRepository.findOne(1, { relations: ['roles'] });
console.log(user.roles);
```
这里我们通过 `findOne` 方法查询到 id 为 1 的用户,并且使用 `relations` 选项指定了需要关联查询的字段。最终输出该用户的所有角色。
如果我们想要删除某个用户的某个角色,可以通过以下代码实现:
```typescript
const user = await userRepository.findOne(1, { relations: ['roles'] });
user.roles = user.roles.filter(role => role.id !== 1);
await userRepository.save(user);
```
这里我们首先查询到 id 为 1 的用户,并且获取到该用户的所有角色。然后,我们从该用户的角色列表中过滤掉 id 为 1 的角色,并将修改后的用户保存到数据库中。
以上就是 TypeORM 中实现多对多关系的增删改查操作的示例。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)