1. 创建实体(前面的博客以及提到过)

// user.entities.ts(用户表)
// 编写实体,用于一一对应数据库中的数据映射关系
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

// 定义一个实体类
/*
当然我们也可以自定义对应数据映射到数据库中的存储属性
我们可以设置存储的类型,长度等..
*/
@Entity()
export class User {
// 定义Boys的id (一般设置为自增)
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 定义user名字
/*
设置数据库中的存储形式
*/
@Column({ type: 'varchar', length: 255 })
username: string;

// 定义用户密码
@Column({ type: 'varchar' })
password: string;
}

结果展示(多个实体,创建基本一致)

image

2. 创建一对一关系

  • 官方文档

  • 下面以两张表作为例子,一张是user表(用户),另一张是profile表(基本信息),因为一个用户基本上智能对应一份基本信息,建立一对一映射关系一般是主表对应副表,主表没有外键,副表外键对应关联主表的主键(默认),下面是两张表:

主表(user)

image

副表(profile)

image

代码展示

  • 这里只展示副表实体(主表不需要改动任何数据)
// 编写实体,用于一一对应数据库中的数据映射关系
import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToOne,
JoinColumn,
} from 'typeorm';
import { User } from './user.entities';

@Entity()
export class Profile {
// id
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 性别
@Column()
gender: number;

// 个人头像
@Column()
photo: string;

// 地址
@Column()
address: string;

// 建立与user实体的一对一映射关系
@OneToOne(() => User)
// 不设置的话,typeOrm会自动将下面的属性名拼接上主表的主键属性名 - userId(驼峰)
@JoinColumn({ name: 'user_id' }) //给当前表加入一个字段(一列)
user: User;
/*
在 Profile 实体类中声明一个名为 user 的字段,该字段的类型为 User 实体类。
通过使用 @OneToOne(() => User) 注解,指定了 user 字段与 User 实体类的 id 字段进行关联(默认主键)
即将 User 实体类的 id 字段与 Profile 实体类的 user_id 字段进行了一对一的映射。
*/
}

3. 创建一对多/多对一关系

  • 官方文档

  • 创建一对多/多对一关系就使用以下两张表,分别是logs(日志)表以及user(用户)表,因为一个用户可以有多个log(请求操作日志)的输出,多个日志也对应这一个用户,这里就是双向的

Logs(日志操作)表

image

user(用户)表

image

代码展示

  • Logs(日志操作)表
// 编写实体,用于一一对应数据库中的数据映射关系
import {
Entity,
Column,
PrimaryGeneratedColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import { User } from '../user.entities';

@Entity()
export class Logs {
// 日志
// id
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 请求路径
@Column()
path: string;

// 请求方法
@Column()
method: string;

// 请求响应数据
@Column()
data: string;

// 返回结果
@Column()
result: number;

// 定义多对一关系(多个日志对应一个用户)
@ManyToOne(() => User, (user) => user.logs)
@JoinColumn({ name: 'user_id' }) // 这段代码可有可无(官方推荐使用)
user: User; // 返回日志对应的user是以 User实体类 为类型的数据
}
  • user(用户数据)表
// 编写实体,用于一一对应数据库中的数据映射关系
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm';
import { Logs } from './logs/logs.entities';

// 定义一个实体类
/*
当然我们也可以自定义对应数据映射到数据库中的存储属性
我们可以设置存储的类型,长度等..
*/
@Entity()
export class User {
// 定义Boys的id (一般设置为自增)
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 定义user名字
/*
设置数据库中的存储形式
*/
@Column({ type: 'varchar', length: 255 })
username: string;

// 定义用户密码
@Column({ type: 'varchar' })
password: string;

// 定义一对多关系(一个用户对应着多个日志操作)
@OneToMany(() => Logs, (logs) => logs.user)// 可以认为第二个箭头函数是一个条件
/*
第二个参数也是一个回调函数,这个回调函数的意义是告诉sql语句,当我们
查询某一个用户信息时,请同时查询logs表中的user字段,因为这个字段是
建立 OneToMany 关系的核心,通过两者的及案例关系查询到的 logs(日志数据)
返回到 下面的 logs 字段中,当查询到这个用户时同步返回 logs数组数据
*/
logs: Logs[]; // 返回的日志数据是以 Logs实体类为子项的数组
}

4. 创建多对多关系

  • 官方文档

  • 多对多关系可以使用以下两张表来表示,分别是用户表以及角色表,因为一个用户可以对应多个角色,一个角色也可以有多个用户

代码展示:

  • user(用户)表
// 编写实体,用于一一对应数据库中的数据映射关系
import {
Entity,
Column,
PrimaryGeneratedColumn,
OneToMany,
ManyToMany,
JoinTable,
} from 'typeorm';
import { Logs } from './logs/logs.entities';
import { userInfo } from 'os';
import { Roles } from './roles/roles.entities';

// 定义一个实体类
/*
当然我们也可以自定义对应数据映射到数据库中的存储属性
我们可以设置存储的类型,长度等..
*/
@Entity()
export class User {
// 定义Boys的id (一般设置为自增)
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 定义user名字
/*
设置数据库中的存储形式
*/
@Column({ type: 'varchar', length: 255 })
username: string;

// 定义用户密码
@Column({ type: 'varchar' })
password: string;

// 定义一对多关系(一个用户对应着多个日志操作)
@OneToMany(() => Logs, (logs) => logs.user) // 可以认为第二个箭头函数是一个条件
/*
第二个参数也是一个回调函数,这个回调函数的意义是告诉sql语句,当我们
查询某一个用户信息时,请同时查询logs表中的user字段,因为这个字段是
建立 OneToMany 关系的核心,通过两者的及案例关系查询到的 logs(日志数据)
返回到 下面的 logs 字段中,当查询到这个用户时同步返回 logs数组数据
*/
logs: Logs[]; // 返回的日志数据是以 Logs实体类为子项的数组

// 定义多对多关系(一个用户对应着多个角色)
@ManyToMany(() => Roles, (role) => role.users)
@JoinTable({ name: 'user_roles' })// 及案例联合关系(生成一张中间联合表)
roles: Roles[];
}
  • roles(角色)表
// 编写实体,用于一一对应数据库中的数据映射关系
import { Entity, Column, PrimaryGeneratedColumn, ManyToMany } from 'typeorm';
import { User } from '../user.entities';

@Entity()
export class Roles {
// id
@PrimaryGeneratedColumn() // 设置自动生成不重复的数据
id: number;

// 角色姓名
@Column()
name: number;

// 创建多对多映射关系(一个角色可以有多个用户)
@ManyToMany(() => User, (user) => user.roles)
users: User[];
}

生成一张联合表

image