前回
モデルの作成
クイックスタートを使用したので、モデルは以下の通りになっています。
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実装について
を学びました。
次回はステップバイステップガイドを掘り下げようと思います。
コード
今回のコードは、以下に格納しました。