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);

一對多和多對一

正如我們前面所瞭解的,它指的是第一個表字段的例項包含第二個表字段的多個例項,稱為一對多對映;第一個表的多個例項只包含第二個表的一個例項,稱為多對一對映。

考慮Studentproject實體的例子,其中一名學生可以參與多個專案,但每個專案只由一名學生負責。

讓我們建立一個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[];
}
廣告
© . All rights reserved.