하나의 블로그 post는 여러 tag들을 가질 수 있고
하나의 tag 또한 여러 post에 적용될 수 있으므로 Many to Many 이다
하지만 post 엔티티에만 tag를 가져야하므로 이는 단방향 Many to Many이다.
import {
Entity,
ManyToMany,
JoinTable,
} from 'typeorm';
import { Tag } from 'src/tags/tag.entity';
@Entity()
export class Post {
...
@ManyToMany(() => Tag)
@JoinTable()
tags?: Tag[];
}
You need to define a decorator called join table, and this particular join table decorator must be put in an entity that is on the owning side of the relationship.
In our case, our post will be on the owning side of relationship because we want to fetch tags along with the post, as a part of the post.
단방향 Many to Many를 설정하기 위해선 owner side 엔티티에
@ManyToMany
@JoinTable()
데코레이터를 집어넣자.
단방향이므로 tag entity에는 Many to Many 안넣어도됨.
예를들어 user가 새로운 post를 생성할때
만약 태그 자바스크립트를 붙이고싶으면 (tag 테이블에 이미 tag가 존재하다고 가정)
태그 table 안에
자스 id:1 라면
createPostDto 안에 tags:[1]
라고 가정해보자
그러면 이 post_tags_tag
라는 새로운 테이블이 생기고, id가 잘 들어가있다.
post_tags_tag
테이블에는 post와 매칭된 tag가 함께 저장되어있다.
tag를 삭제할때, 해당 tag를 사용한 post는 당연히 삭제되지않지만 post_tags_tag
테이블에는 삭제됐으면 할때 tag-post 를 양방향 Many to Many로 만들어야한다.
tag 엔티티에 @ManyToMany
를 사용하여 post 엔티티를 추가하자.
tag 엔티티는 joinTable 데코레이터가없어서 owner가 아니므로
👇tag 삭제할때 onDelete:'CASCADE'
해줘야함👇
이제 삭제를해보자
tag 테이블에 1,3 id를 가진 2개의 tag가 있다
post 테이블에 21,22 아이디를 가진 post들이 있는데
처음 생성할때 두 post에 tag 1,3을 넣어줬기때문에 중간테이블에 저렇게 기록되어있다
✍ id=1 인 tag를 삭제했다.
tag 테이블과 중간테이블에 잘 삭제되었다.
엔티티에서 @DeleteDateColumn
이라는 컬럼과 보통 사용되는 softDelete
db에 완전히 삭제되지않고, 위 @DeleteDateColumn
을 설정해둔 db컬럼에 언제삭제됐는지 timestamp만 기록되게 하는 것이다. 또한 중간테이블에도 db가 삭제되지않는다.
예를들어 id가 3인 tag를 softdelete 한다면 그냥 delete와 다르게 위에 post_tags_tag
에도 남아있다.
+
service 파일에서 softDelete이란 메소드를 사용해야한다.