- TypeORM 教程
- TypeORM - 首頁
- TypeORM - 簡介
- TypeORM - 安裝
- TypeORM - 建立一個簡單的專案
- TypeORM - 連線 API
- TypeORM - 實體
- TypeORM - 關係
- TypeORM - 使用 Repository
- TypeORM - 使用 Entity Manager
- TypeORM - 查詢構建器
- TypeORM - 查詢操作
- TypeORM - 事務
- TypeORM - 索引
- TypeORM - 實體監聽器和日誌記錄
- TypeORM 與 JavaScript
- TypeORM - 使用 MongoDB
- TypeORM 與 Express
- TypeORM - 遷移
- TypeORM - 使用 CLI
- TypeORM 有用資源
- TypeORM - 快速指南
- TypeORM - 有用資源
- TypeORM - 討論
TypeORM - 關係
關係用於指資料庫中表之間的關係。一般來說,當其中一個表具有引用另一個表主鍵的外部索引鍵時,這兩個表之間就存在關係。此功能使關係資料庫更強大,並能有效地儲存資訊。
TypeORM 允許實體相互關聯,進而關聯資料庫表。一般來說,關係可以分為四類,如下所示:
一對一 - 給定實體的一個物件只與目標實體的一個物件相關,反之亦然。例如,一個國家只有一個首都,同樣一個城市也只有一個國家的首都。
多對一 - 給定實體的多個物件與目標實體的一個物件相關。例如,一個城市屬於一個國家,但一個國家可以有多個城市。
一對多 - 與多對一相同,只是關係反過來了。
多對多 - 給定實體的多個物件與目標實體的多個物件相關。例如,一篇文章可以被標記在多個主題下,例如程式語言、金融等,同時一個特定的標籤也可以有多篇文章。
TypeORM 還提供選項來增強實體的關係。它們如下所示:
- eager - 源實體物件也載入目標實體物件。
- cascade - 當源實體物件被插入或更新時,目標實體物件也會被插入或更新。
- onDelete - 當源實體物件被刪除時,目標實體物件也會被刪除。
- primary - 用於指定關係列是否為主鍵。
- nullable - 用於指定關係列是否可為空。
讓我們詳細瞭解不同型別的關係對映。
一對一
正如我們前面所瞭解的,它指的是一個表字段的例項包含另一個表字段的例項,反之亦然。讓我們建立一個Details表:
Details.ts
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class Details {
@PrimaryGeneratedColumn()
id: number;
@Column()
gender: string;
@Column()
country: string;
}
讓我們建立一個名為 Customer 的另一個實體:
Customer.ts
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);
一對多和多對一
正如我們前面所瞭解的,它指的是第一個表字段的例項包含第二個表字段的多個例項,稱為一對多對映;第一個表的多個例項只包含第二個表的一個例項,稱為多對一對映。
考慮Student和project實體的例子,其中一名學生可以參與多個專案,但每個專案只由一名學生負責。
讓我們建立一個Project實體:
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;
}
現在,我們建立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。但是,@OneToMany不能沒有@ManyToOne,並且@ManyToOne屬性包含“關係 ID”和外部索引鍵。
我們可以在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);
多對多
正如我們前面所瞭解的,它指的是一個表中的多條記錄與另一個表中的多條記錄相關。例如,大學學生可以同時選修多門課程,這意味著學生每學期可能會有四五門課程,一門課可以有多名學生。
我們可以簡單地總結一下,一個學生可以選修多門課程,一門課程可以有多名學生。讓我們建立一個Classes實體:
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[];
}