前回
モデルの作成
クイックスタートを使用したので、モデルは以下の通りになっています。
src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() firstName: string; @Column() lastName: string; @Column() age: number; }
まず、@Entityで、エンティティを宣言します。
そして、Userクラスを宣言し、id、firstName、lastName、ageを持つテーブルのような形で、@PrimaryGeneratedColumn()や、@Column()で定義します。
ドメインロジックは以下のようになります。
src/index.ts
import { AppDataSource } from "./data-source"; import { User } from "./entity/User"; (async () => { await AppDataSource.initialize(); const userRepository = AppDataSource.getRepository(User); const user = new User(); user.firstName = "Satoh"; user.lastName = "Kojiro"; user.age = 23; await userRepository.save(user); const allUsers = await userRepository.find(); const satoh = await userRepository.findOneBy({ firstName: "Satoh", lastName: "Kojiro", }); console.log(allUsers); console.log(satoh); await userRepository.remove(satoh); })();
AppDataSourceは、まずinitialize()します。
そこから、getRepositoryでリポジトリを生成します。
その後、Userのインスタンスを生成し、値を代入します。
そして、await userRepository.save(user);で、データベースに保存します。
値を参照する際は、await userRepository.find();か、await userRepository.findOneByなどで参照します。
削除する際は、await userRepository.remove(satoh);のように削除します。
Active Record実装
TypeORMは、Active Record実装もできます。
モデルを修正します。
src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm"; @Entity() export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() firstName: string; @Column() lastName: string; @Column() age: number; }
BaseEntityを拡張しています。
ドメインロジックを修正します。
src/index.ts
import { AppDataSource } from "./data-source"; import { User } from "./entity/User"; (async () => { await AppDataSource.initialize(); const user = new User(); user.firstName = "Satoh"; user.lastName = "Kojiro"; user.age = 23; await user.save(); const allUsers = await User.find(); const satoh = await User.findOneBy({ firstName: "Satoh", lastName: "Kojiro", }); console.log(allUsers); console.log(satoh); await satoh.remove(); })();
npm startしたところ通らなかったので、tsconfigを修正します。
出たエラー
TypeError: Class constructor BaseEntity cannot be invoked without 'new'
参考
tsconfig.json
{
"compilerOptions": {
"lib": ["es6"],
"target": "es6",
"module": "commonjs",
"moduleResolution": "node",
"outDir": "./build",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true
}
}
npm startしたところ、通るようになりました。
まとめ
ここまでで、
- モデルの作成について
- Active Record実装について
を学びました。
次回はステップバイステップガイドを掘り下げようと思います。
コード
今回のコードは、以下に格納しました。