TypeORM-関係

リレーションは、データベース内のテーブル間のリレーションを参照するために使用されます。一般に、一方が他方のテーブルの主キーを参照する外部キーを持っている場合、2つのテーブル間に関係が存在します。この機能により、リレーショナルデータベースがより強力になり、情報を効率的に保存できます。

TypeORMを使用すると、エンティティを相互に関連付けたり、データベーステーブルに関連付けたりすることができます。一般に、関係は4つの大きなカテゴリに分類できます。それらは次のとおりです、

one-to-one−指定されたエンティティの1つのオブジェクトは、ターゲットエンティティの1つのオブジェクトのみに関連し、その逆も同様です。たとえば、ある国の首都は1つだけであり、同様に、都市は1つの国の首都になります。

many-to-one−指定されたエンティティの複数のオブジェクトは、ターゲットエンティティの1つのオブジェクトに関連しています。たとえば、都市は1つの国にのみ分類されますが、国には複数の都市を含めることができます。

one-to-many −関係が逆になることを除いて、多対1と同じです。

many-to-many−指定されたエンティティの複数のオブジェクトは、ターゲットエンティティの複数のオブジェクトに関連しています。たとえば、記事はプログラミング言語、財務などの複数のトピックの下でタグ付けされる場合があり、同時に特定のタグにも複数の記事が含まれる場合があります。

TypeORMは、エンティティの関係を強化するためのオプションも提供します。それらは次のとおりです-

  • eager −ソースエンティティオブジェクトは、ターゲットエンティティオブジェクトもロードします。
  • cascade −ソースエンティティオブジェクトが挿入または更新されている間に、ターゲットエンティティオブジェクトが挿入または更新されます。
  • onDelete −ソースエンティティオブジェクトが削除されている間、ターゲットエンティティオブジェクトも削除されます。
  • primary −リレーション列が主キーであるかどうかを指定するために使用されます。
  • nullable −リレーション列がNULL可能かどうかを指定するために使用されます。

さまざまなタイプの関係マッピングについて詳しく見ていきましょう。

1対1

前に学習したように、あるテーブルフィールドのインスタンスには別のテーブルフィールドのインスタンスが含まれ、その逆も同様です。作成しましょう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;
}

ここに、

マッピングを追加しました OneToOneDetails テーブル。 @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);

1対多および多対1

前に学習したように、最初のテーブルフィールドのインスタンスによって参照され、2番目のテーブルフィールドの複数のインスタンスが含まれています。 One-to-Many マッピングと最初のテーブルの複数のインスタンスには、2番目のテーブルのインスタンスが1つだけ含まれています Many-to-One マッピング。

の例を考えてみましょう Student そして project 一方、学生は複数のプロジェクトに取り組むことができますが、各プロジェクトは1人の学生によってのみ処理されます。

を作成しましょう 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);

多対多

前に学習したように、1つのテーブル内の複数のレコードによって参照され、別のテーブル内の複数のレコードに関連付けられています。例を考えてみましょう。大学生は一度に複数のクラスに登録できます。つまり、学生は学期ごとに4つまたは5つのクラスを持ち、クラスには多くの学生を含めることができます。

簡単に言えば、生徒には多くのクラスがあり、クラスには多くの生徒がいます。のエンティティを作成しましょう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[];
}