TypeORM-クエリビルダー

クエリビルダーは、複雑なSQLクエリを簡単な方法で構築するために使用されます。これは、ConnectionメソッドおよびQueryRunnerオブジェクトから初期化されます。

QueryBuilderは3つの方法で作成できます。

接続

接続方法を使用してQueryBuilderを使用する方法の簡単な例を考えてみましょう。

import {getConnection} from "typeorm"; 

const user = await getConnection() .createQueryBuilder() 
.select("user") 
.from(User, "user") 
.where("user.id = :id", { id: 1 }) .getOne();

エンティティマネージャー

次のようにエンティティマネージャを使用してクエリビルダーを作成しましょう-

import {getManager} from "typeorm"; 

const user = await getManager() .createQueryBuilder(User, "user") .where("user.id = :id", { id: 1 })    .getOne();

リポジトリ

リポジトリを使用してクエリビルダーを作成できます。以下に説明します。

import {getRepository} from "typeorm"; 

const user = await getRepository(User) .createQueryBuilder("user") .where("user.id = :id", { id: 1 }) .getOne();

エイリアス

エイリアスはSQLエイリアスと同じです。以下に説明するように、QueryBuilderを使用してStudentテーブルのエイリアスを作成します-

import {getConnection} from "typeorm"; 

const user = await getConnection() .createQueryBuilder() 
.select("stud") 
.from(Student, "stud")

このクエリは、と同等です。

select * from students as stud

パラメーター

Parametersクエリの動的な値のプレースホルダーとして使用されます。多くの場合、異なるエンティティオブジェクトを検索するクエリは、値を除いて同じです。たとえば、別の学生を見つけるためのクエリは、Student IDデータ。この場合、パラメータを使用できますStudent ID 次に、パラメータを変更して、さまざまな学生オブジェクトを取得します。

パラメータのもう1つの重要な使用法は、SQLインジェクションを防ぐことです。これは、最新のWebアプリケーションにおける重要なセキュリティ違反の1つです。クエリでパラメータを使用することで、SQLインジェクション攻撃に耐えることができます。

パラメータのもう1つの重要な使用法は、SQLインジェクションを防ぐことです。これは、最新のWebアプリケーションにおける重要なセキュリティ違反の1つです。クエリでパラメータを使用することで、SQLインジェクション攻撃に耐えることができます。

例えば

"student.id = :id", { id: 1 }

ここに、

:id-パラメータ名。

{id:1}-パラメータの値

式の追加

このセクションでは、式の使用方法について説明します。

どこ

where 条件が一致した場合にレコードをフィルタリングするために使用されます。

createQueryBuilder("student") .where("student.id = :id", { id: 1 })

このクエリは、と同等です。

select * from students student where student.id=1;

内部でAND、OR、NOT、IN条件を使用することもできます。

持っている

単純な表現を以下に定義します-

createQueryBuilder("student") .having("student.id = :id", { id: 1 })

このクエリは、と同等です。

select * from students student having student.id=1;

orderBy

orderbyは、フィールドに基づいてレコードをソートするために使用されます。

createQueryBuilder("student") .orderBy("student.name")

このクエリは、と同等です。

select * from students student order by student.name;

groupBy

指定された列に基づいてレコードをグループ化するために使用されます。

createQueryBuilder("student") .groupBy("student.id")

このクエリは、と同等です。

select * from students student group by student.id;

制限

行の選択を制限するために使用されます。以下の例は、クエリビルダーで制限を使用する方法を示しています。

createQueryBuilder("student") .limit(5)

このクエリは、と同等です。

select * from students student limit 5;

オフセット

オフセットは、結果をスキップする行数を指定するために使用されます。以下に定義されています-

createQueryBuilder("student") .offset(5)

このクエリは、と同等です。

select * from students student offset 5;

参加する

join句は、関連する列に基づいて、2つ以上のテーブルの行を結合するために使用されます。2つのエンティティを検討してください-

Student.ts

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[]; 
}

Project.ts

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm"; 
import {Student} from "./Student"; 

@Entity() 
export class Project { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string; 
   
   @ManyToOne(type => Student, student => student.projects) student: Student; 
}

以下のクエリを使用して単純な左結合を実行してみましょう-

const student = await createQueryBuilder("student") .leftJoinAndSelect("student.projects", "project") 
.where("student.name = :name", { name: "Student1" }) 
.getOne();

このクエリは、と同等です。

SELECT student.*, project.* FROM students student 
   LEFT JOIN projects project ON project.student = student.id 
   WHERE student.name = 'Student1'

同様に、内部結合も試すことができます。

選択せずに参加する

selectを使用せずにデータを結合できます。次のように内部結合を使用してこの例を試してみましょう-

const student = await createQueryBuilder("student") .innerJoin("student.projects", "project") 
   .where("student.name = :name", { name: "student1" }) 
   .getOne();

上記のクエリは-と同等です

SELECT student.* FROM students student 
   INNER JOIN projects project ON project.student = student.id 
   WHERE student.name = 'Student1';

ページネーション

アプリケーションにさらにデータがある場合は、ページ付け、ページスライダー、またはスクロール機能が必要です。

たとえば、アプリケーションで最初の5人の学生のプロジェクトを表示する場合は、

const students = await getRepository(Student) .createQueryBuilder("student") .leftJoinAndSelect("student.projects", "project") 
   .take(5) 
   .getMany();

サブクエリ

これは、別のクエリまたはネストされたクエリ内のクエリと呼ばれます。FROM、WHERE、およびJOIN式でサブクエリを使用します。

簡単な例を以下に示します-

const projects = await connection .createQueryBuilder() .select("project.id", "id")
.addSelect(subQuery => { 
   return subQuery 
      .select("student.name", "name") .from(Student, "student") 
      .limit(1); 
}, "name")
.from(Project, "project") .getMany();

隠しフィールド

列フィールドのいずれかが{select:false}としてマークされている場合、その列は非表示の列と見なされます。以下のエンティティを検討してください-

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
   
   @Column({select: false}) 
   address: string; 
}

ここに、

address フィールドはとしてマークされます hidden。使用できますaddSelect列から情報を取得するメソッド。それは以下に定義されています、

const student = await connection.getRepository(Student) .createQueryBuilder() .select("student.id", "student")    .addSelect("student.address") .getMany();

getSql()

このメソッドは、クエリビルダーによって生成されたSQLクエリを取得するために使用されます。以下に定義されています-

const sql = createQueryBuilder("student") .where("student.name = :name", { name: "Student1" })  .orWhere("student.age = :age", { age: 14 }) 
.getSql();