【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다
10211 단어 TypeORMTypeScript메모PostgreSQL초보자
소개
TypeORM을 공부했을 때의 메모입니다.
설정
여기 참조
mkdir sample && cd sample
npx typeorm init --database postgres --express --docker
yarn
One-To-Many relation
한 명의 사용자가 여러 사진 데이터를 연결하는 경우를 생각해보십시오.
Entity 정의
src/entity/User.tsimport {
Entity,
PrimaryGeneratedColumn,
Column,
OneToMany,
BaseEntity,
} from 'typeorm';
import { Photo } from './Photo';
@Entity()
export class User extends BaseEntity { // extendしないとUser.createメソッドが使えない
@PrimaryGeneratedColumn()
readonly id: number;
@Column()
name: string;
@OneToMany((type) => Photo, (photo) => photo.user) // これはフォールドでなく、relationを表現しているだけ
photos: Photo[];
}
src/entity/Photo.tsimport {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
BaseEntity,
} from 'typeorm';
import { User } from './User';
@Entity()
export class Photo extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column()
userId: number;
@ManyToOne((type) => User, (user) => user.photos) // relationを表現しているだけで、fieldとはならない
@JoinColumn({ name: 'userId' }) // userIdがforeignキーとなることを表す。
user: User;
}
컨트롤러 구현
여기서 UserContoller
에서 새로운 요청이 왔을 때의 처리를 예로 생각한다.
src/controller/UserController.ts
...
async save(request: Request, response: Response, next: NextFunction) {
const { name, url } = request.body;
const user = await User.find({ where: { name } });
if (user.length) {
//すでにユーザーが登録済の場合
await Photo.create({ url, userId: user[0].id }).save();
} else {
//ユーザーが未登録の場合
const newUser = await User.create({ name }).save();
const newPhoto = await Photo.create({ url, userId: newUser.id }).save();
}
return await getConnection() // ormconfig.jsonで定義したDBに接続する。今回はpostgresだけだが、複数のDBに接続している場合は、今回接続するDB名を第一引数にを明示する
.createQueryBuilder(User, 'u') // 第一引数はテーブル名、第二引数はそのalias
.leftJoinAndSelect('u.photos', 'photo')
.getMany();
}
...
이런 식으로 돌아온다.
참고
htps: //같다. 베 / 아오 4C9d 조 7 0
htps : // typeo rm. 이오/#
Reference
이 문제에 관하여(【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/theFirstPenguin/items/94eae13adcbfaa4f6aa9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
여기 참조
mkdir sample && cd sample
npx typeorm init --database postgres --express --docker
yarn
One-To-Many relation
한 명의 사용자가 여러 사진 데이터를 연결하는 경우를 생각해보십시오.
Entity 정의
src/entity/User.tsimport {
Entity,
PrimaryGeneratedColumn,
Column,
OneToMany,
BaseEntity,
} from 'typeorm';
import { Photo } from './Photo';
@Entity()
export class User extends BaseEntity { // extendしないとUser.createメソッドが使えない
@PrimaryGeneratedColumn()
readonly id: number;
@Column()
name: string;
@OneToMany((type) => Photo, (photo) => photo.user) // これはフォールドでなく、relationを表現しているだけ
photos: Photo[];
}
src/entity/Photo.tsimport {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
BaseEntity,
} from 'typeorm';
import { User } from './User';
@Entity()
export class Photo extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column()
userId: number;
@ManyToOne((type) => User, (user) => user.photos) // relationを表現しているだけで、fieldとはならない
@JoinColumn({ name: 'userId' }) // userIdがforeignキーとなることを表す。
user: User;
}
컨트롤러 구현
여기서 UserContoller
에서 새로운 요청이 왔을 때의 처리를 예로 생각한다.
src/controller/UserController.ts
...
async save(request: Request, response: Response, next: NextFunction) {
const { name, url } = request.body;
const user = await User.find({ where: { name } });
if (user.length) {
//すでにユーザーが登録済の場合
await Photo.create({ url, userId: user[0].id }).save();
} else {
//ユーザーが未登録の場合
const newUser = await User.create({ name }).save();
const newPhoto = await Photo.create({ url, userId: newUser.id }).save();
}
return await getConnection() // ormconfig.jsonで定義したDBに接続する。今回はpostgresだけだが、複数のDBに接続している場合は、今回接続するDB名を第一引数にを明示する
.createQueryBuilder(User, 'u') // 第一引数はテーブル名、第二引数はそのalias
.leftJoinAndSelect('u.photos', 'photo')
.getMany();
}
...
이런 식으로 돌아온다.
참고
htps: //같다. 베 / 아오 4C9d 조 7 0
htps : // typeo rm. 이오/#
Reference
이 문제에 관하여(【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/theFirstPenguin/items/94eae13adcbfaa4f6aa9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
src/entity/User.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
OneToMany,
BaseEntity,
} from 'typeorm';
import { Photo } from './Photo';
@Entity()
export class User extends BaseEntity { // extendしないとUser.createメソッドが使えない
@PrimaryGeneratedColumn()
readonly id: number;
@Column()
name: string;
@OneToMany((type) => Photo, (photo) => photo.user) // これはフォールドでなく、relationを表現しているだけ
photos: Photo[];
}
src/entity/Photo.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
BaseEntity,
} from 'typeorm';
import { User } from './User';
@Entity()
export class Photo extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column()
userId: number;
@ManyToOne((type) => User, (user) => user.photos) // relationを表現しているだけで、fieldとはならない
@JoinColumn({ name: 'userId' }) // userIdがforeignキーとなることを表す。
user: User;
}
컨트롤러 구현
여기서 UserContoller
에서 새로운 요청이 왔을 때의 처리를 예로 생각한다.
src/controller/UserController.ts
...
async save(request: Request, response: Response, next: NextFunction) {
const { name, url } = request.body;
const user = await User.find({ where: { name } });
if (user.length) {
//すでにユーザーが登録済の場合
await Photo.create({ url, userId: user[0].id }).save();
} else {
//ユーザーが未登録の場合
const newUser = await User.create({ name }).save();
const newPhoto = await Photo.create({ url, userId: newUser.id }).save();
}
return await getConnection() // ormconfig.jsonで定義したDBに接続する。今回はpostgresだけだが、複数のDBに接続している場合は、今回接続するDB名を第一引数にを明示する
.createQueryBuilder(User, 'u') // 第一引数はテーブル名、第二引数はそのalias
.leftJoinAndSelect('u.photos', 'photo')
.getMany();
}
...
이런 식으로 돌아온다.
참고
htps: //같다. 베 / 아오 4C9d 조 7 0
htps : // typeo rm. 이오/#
Reference
이 문제에 관하여(【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/theFirstPenguin/items/94eae13adcbfaa4f6aa9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
...
async save(request: Request, response: Response, next: NextFunction) {
const { name, url } = request.body;
const user = await User.find({ where: { name } });
if (user.length) {
//すでにユーザーが登録済の場合
await Photo.create({ url, userId: user[0].id }).save();
} else {
//ユーザーが未登録の場合
const newUser = await User.create({ name }).save();
const newPhoto = await Photo.create({ url, userId: newUser.id }).save();
}
return await getConnection() // ormconfig.jsonで定義したDBに接続する。今回はpostgresだけだが、複数のDBに接続している場合は、今回接続するDB名を第一引数にを明示する
.createQueryBuilder(User, 'u') // 第一引数はテーブル名、第二引数はそのalias
.leftJoinAndSelect('u.photos', 'photo')
.getMany();
}
...
htps: //같다. 베 / 아오 4C9d 조 7 0
htps : // typeo rm. 이오/#
Reference
이 문제에 관하여(【초보자용 메모】TypeORM/PostgreSQL 로 One-To-Many relation 를 정의한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/theFirstPenguin/items/94eae13adcbfaa4f6aa9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)