📅  最后修改于: 2020-10-19 03:40:59             🧑  作者: Mango
关系用于引用数据库中表之间的关系。通常,当两个表中的一个具有引用另一个表的主键的外键时,两个表之间就存在关系。此功能使关系数据库更强大且更有效地存储信息。
TypeORM允许实体相互关联,并随后与数据库表关联。通常,关系可以分为四大类。它们如下
一对一-给定实体的一个对象仅与目标实体的一个对象相关,反之亦然。例如,一个国家只有一个首都,而一个城市将仅是一个国家的首都。
多对一-给定实体的多个对象与目标实体的一个对象相关。例如,城市仅属于一个国家,但一个国家可以有多个城市。
一对多-与多对一相同,但关系相反。
多对多-给定实体的多个对象与目标实体的多个对象有关。例如,可以在多个主题(如编程语言,财务等)下标记商品,同时,特定标签也可以具有多个商品。
TypeORM还提供增强实体关系的选项。它们如下-
让我们详细研究不同类型的关系映射。
正如我们先前所了解的,它由一个表字段的实例引用而包含另一个表字段的实例,反之亦然。让我们创建一个Details表-
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class Details {
@PrimaryGeneratedColumn()
id: number;
@Column()
gender: string;
@Column()
country: string;
}
让我们创建另一个实体Customer,如下所示:
import {Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn} from "typeorm";
import {Details} from "./Details";
@Entity()
export class Customer {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToOne(type => Details) @JoinColumn()
details: Details;
}
这里,
我们已经添加了将OneToOne映射到Details表的功能。 @JoinColumn()包含“关系ID”和Customer表的外键。我们可以将关系保存在index.ts中,如下所示:
const details = new Details(); details.gender = "female"; details.country = "india" await connection.manager.save(details);
const customer = new Customer(); customer.name = 'customer1'; customer.details = Details; await connection.manager.save(Customer);
如我们先前所知,第一个表字段的实例被引用,该字段包含第二个表字段的多个实例,称为一对多映射,第一个表的多个实例仅包含第二个表的一个实例,称为多对一个映射。
以学生和项目实体为例,而学生可以从事多个项目,但每个项目只能由一名学生处理。
让我们创建一个Project实体,如下所示:
import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm"; import {Student} from "./Student";
@Entity()
export class Project {
@PrimaryGeneratedColumn()
id: number;
@Column()
projects: string;
@ManyToOne(type => Student, student => student.projects) student: Student;
}
现在,我们创建学生实体,如下所示:
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm"; import {Project} from "./Project";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Project, project => project.student) projects: Project[];
}
这里,
@OneToMany属性映射到Project,而@ManyToOne属性映射到Student 。但是,如果没有@ManyToOne和@ManyToOne属性包含“关系ID”和外键,则@OneToMany将不存在。
我们可以将连接保存在index.ts中,如下所示:
const proj1 = new Project(); proj1.projects = "database management"; await connection.manager.save(proj1);
const proj2 = new Project(); proj2.projects = "web application"; await connection.manager.save(proj2);
const stud = new Student(); stud.name = "Student1"; stud.projects = [proj1, proj2]; await connection.manager.save(stud);
正如我们前面所了解的,一个表中的多个记录所引用的内容与另一表中的多个记录相关。举个例子,一个大学生可以一次同时上多个课,这意味着一个学生每学期可以开四个或五个课,一个班可以有很多学生。
我们可以简单地得出结论,一个学生有很多班,一个班上有很多学生。让我们为类创建一个实体,如下所示:
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class Classes {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
}
现在,我们创建如下的Student实体-
import {Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable} from "typeorm";
import {Classes} from "./Classes";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
subjects: string;
@ManyToMany(type => Classes) @JoinTable()
classes: Classes[];
}