TypeORM框架 => 实体
实体是一个映射到数据库表(或使用 MongoDB 时的集合)的类。 你可以通过定义一个新类来创建一个实体,并用
@Entity()
来标记:
基础实体
语法:@方法名() 表示装饰器
@Entity()
不仅可以指定在哪个数据库中创建,还可以给创建的实体取名字
// 引入typeorm方法
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import {User} from './user';
// user实体将在secondDB数据库内创建(创建在那个数据库中)
@Entity({ database: "secondDB" })
// 定义一个名为user的实体 (指定实体的名字)
@Entity('user')
export class user {
// 主键(主列)
@PrimaryGeneratedColumn()
id: number;
// 1. 普通列
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
isActive: boolean;
// 2. 普通列
@Column('int', {
nullable: true,
name: 'UserId',
comment: 'User.id',
})
UserId: number | null;
// 定义了role属性,类型为int,可以为空,默认值为0,名称为role
@Column('int', {
nullable: true,
default: '0',
name: 'role',
comment: '项目 用户角色定位;默认创建者30',
})
role: number | null;
// - 定义了`user`属性,用于关联查询。
user: User;
// 定义了`isAdmin`方法,用于判断当前用户是否为管理员
/**
* 是否管理员
* @return {boolean}
*/
get isAdmin() {
return (this.role || 0) > 10;
}
})
}
创建结果:
+-------------+--------------+----------------------------+
| user |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| firstName | varchar(255) | |
| lastName | varchar(255) | |
| isActive | boolean | |
+-------------+--------------+----------------------------+
嵌入式实体
嵌入列是一个列,它接受具有自己列的类,并将这些列合并到当前实体的数据库表中。
例如:
- 现在有Name和Student两个实体
// Name实体
import {Entity, Column} from "typeorm";
export class Name {
@Column()
first: string;
@Column()
last: string;
}
// Student实体
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: string;
@Column()
faculty: string;
}
- 在Student实体中引入Name实体,让其作为Student实体中的列
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
import {Name} from "./Name";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: string;
// 使用引入的实体
@Column(type => Name)
name: Name;
@Column()
faculty: string;
}
结果:
+-------------+--------------+----------------------------+
| student |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| nameFirst | varchar(255) | |
| nameLast | varchar(255) | |
| faculty | varchar(255) | |
+-------------+--------------+----------------------------+
实体继承
继承就是子类可以使用父类的属性和方法
你可以使用实体继承模式减少代码中的重复
。 最简单和最有效的是具体的表继承。在实际开发中,也是最常用的解决代码复用方法
。
将多个实体都会用到的共同列,都写在一个基类中,下面的Content就是一个基类
export abstract class Content
是一个抽象类的定义,使用了export
关键字使得该类可以在其他模块中使用。抽象类是不能直接被实例化的类,它只能被继承。该类定义了一个名为Content
的抽象类,其中包含了三个属性:id
、title
和description
。
由于该类是抽象类(基类),因此不能直接创建实例,只能被其他类继承并实现其未实现的方法和属性
export abstract class Content {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
}
Photo实体继承了Content基类的几个属性
@Entity()
export class Photo extends Content {
@Column()
size: string;
}
结果:
+-------------+--------------+----------------------------+
| Photo |
+-------------+--------------+----------------------------+
| id | int(11) | PRIMARY KEY AUTO_INCREMENT |
| title | varchar(255) | |
| description | varchar(255) | |
| size | varchar(255) | |
+-------------+--------------+----------------------------+
单表继承
单表继承是一种模式,但是在数据库中,它们存储在同一个表中
@Entity()
@TableInheritance({ column: { type: "varchar", name: "type" } })
export class Content {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
}
@TableInheritance({ column: { type: "varchar", name: "type" } })
装饰器表示该实体类使用了表继承策略。column
选项表示继承类型存储在type
列中,类型为varchar
。这意味着在数据库中,Content
和其子类的数据将存储在同一个表中,但使用type
列来区分不同的子类
@ChildEntity()
export class Photo extends Content {
@Column()
size: string;
}
@ChildEntity()
装饰器用来定义实体类Photo
,表示该类继承自Content
,并且是Content
的子类。因为它是子类,所以它可以继承父类中所有的属性和方法。在这里,它继承了Content
的三个属性:id
、title
和description
。
转载自:https://juejin.cn/post/7236956937463873596