likes
comments
collection
share

TypeORM框架 => 实体

作者站长头像
站长
· 阅读数 17

实体是一个映射到数据库表(或使用 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      |                            |
+-------------+--------------+----------------------------+

嵌入式实体

嵌入列是一个列,它接受具有自己列的类,并将这些列合并到当前实体的数据库表中。

例如:

  1. 现在有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;
    
}
  1. 在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的抽象类,其中包含了三个属性:idtitledescription

由于该类是抽象类(基类),因此不能直接创建实例,只能被其他类继承并实现其未实现的方法和属性

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的三个属性:idtitledescription