📅  最后修改于: 2023-12-03 15:35:24.027000             🧑  作者: Mango
TypeORM 是一种用于 Node.js 和 TypeScript 的 ORM 框架。它支持多种数据库,并具有许多有用的功能,如连接池、实体关系和迁移管理等。在本文中,我们将学习如何使用 TypeORM 加载 5 项关系。
一对一关系是指两个实体之间只有一个关联关系。在 TypeORM 中,我们可以使用 @OneToOne
注解来定义一对一关系。
例如,我们有两个实体:User
和 Profile
。每个用户只能有一个资料信息,因此 User
和 Profile
是一对一关系。我们可以这样定义它们之间的关系:
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(type => Profile, profile => profile.user)
profile: Profile;
}
@Entity()
export class Profile {
@PrimaryGeneratedColumn()
id: number;
@Column()
bio: string;
@OneToOne(type => User, user => user.profile)
user: User;
}
我们使用 @OneToOne
注解来指定另一个实体的类型和关系拥有者。这里,我们将 User
实体的 profile
属性关联到 Profile
实体,并将 Profile
实体的 user
属性关联到 User
实体。
一对多关系是指一个实体与另一个实体之间具有多个关联关系。在 TypeORM 中,我们可以使用 @ManyToOne
注解来定义一对多关系。
例如,我们有两个实体:Post
和 User
。每个帖子只能由一个用户发布,但每个用户可以发布多个帖子,因此 Post
和 User
是一对多关系。我们可以这样定义它们之间的关系:
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
content: string;
@ManyToOne(type => User, user => user.posts)
author: User;
}
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Post, post => post.author)
posts: Post[];
}
我们使用 @ManyToOne
注解来指定另一个实体的类型和关系拥有者。这里,我们将 Post
实体的 author
属性关联到 User
实体,并将 User
实体的 posts
属性关联到 Post
实体数组。
多对多关系是指两个实体之间具有多个关联关系。在 TypeORM 中,我们可以使用 @ManyToMany
注解来定义多对多关系。
例如,我们有两个实体:Product
和 Category
。每个产品可以属于多个类别,每个类别也可以包含多个产品,因此 Product
和 Category
是多对多关系。我们可以这样定义它们之间的关系:
@Entity()
export class Product {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(type => Category, category => category.products)
@JoinTable()
categories: Category[];
}
@Entity()
export class Category {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(type => Product, product => product.categories)
products: Product[];
}
我们使用 @ManyToMany
注解来指定另一个实体的类型和关系拥有者。在多对多关系中,我们还需要使用 @JoinTable()
注解来定义关系表。这里,我们将 Product
实体和 Category
实体互相关联,并通过关系表来管理它们之间的关联关系。
继承关系是指一个实体从另一个实体继承属性和方法。在 TypeORM 中,我们可以使用 @ChildEntity
和 @ParentEntity
注解来定义继承关系。
例如,我们有两个实体:Vehicle
和 Car
。Car
是 Vehicle
的子类,它继承了 Vehicle
的所有属性和方法。我们可以这样定义它们之间的关系:
@Entity()
export class Vehicle {
@PrimaryGeneratedColumn()
id: number;
@Column()
make: string;
@Column()
model: string;
@Column()
year: number;
}
@ChildEntity()
export class Car extends Vehicle {
@Column()
engine: string;
@Column()
color: string;
}
我们使用 @ChildEntity
注解来指定子实体,使用 @ParentEntity
注解来指定父实体。这里,Car
实体是 Vehicle
实体的子类,它继承了 Vehicle
实体的所有属性和方法,并且还添加了自己的 engine
和 color
属性。
接口关系是指一个实体实现了一个或多个接口。在 TypeORM 中,我们可以使用 @Entity()
注解来定义一个实体,并使用 @Column()
注解来定义实体属性。我们还可以使用 @Interface()
注解来定义一个接口。
例如,我们有一个名为 IVehicle
的接口,它定义了 make
、model
和 year
属性。我们还有一个名为 Car
的实体,它实现了 IVehicle
接口。我们可以这样定义它们之间的关系:
export interface IVehicle {
make: string;
model: string;
year: number;
}
@Entity()
export class Car implements IVehicle {
@PrimaryGeneratedColumn()
id: number;
@Column()
make: string;
@Column()
model: string;
@Column()
year: number;
@Column()
engine: string;
@Column()
color: string;
}
我们定义了一个名为 IVehicle
的接口,它定义了 make
、model
和 year
属性。我们将 Car
实体定义为实现 IVehicle
接口,并在 Car
实体中定义了 engine
和 color
属性。
这就是 TypeORM 加载 5 项关系的简单介绍。TypeORM 提供了许多有用的功能,以便我们更轻松地管理实体之间的关系。