특정 Post 에 대한 Like이란 항목의 수를 세어 LikeCount 라는 데이터를 만들어야 하는 상황
데이터 모델은 이러하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
type Post {
id: ID! @id
location: String
caption: String!
user: User!
files: [File!]!
likes: [Like!]!
comments: [Comment!]!
}
type Like {
id: ID! @id
user: User!
post: Post!
}
|
cs |
prisma.like을 불러와서 열어보면 전부가 있을 거라고 생각했지만
prisma client는 생각보다 자세히 제공하지 않는다.
(이론적으로는 전부를 불러오면 데이터 트리를 타고 찾는 게 가능하지만)
떄문에 모든 데이터를 보고 싶을 때는 fragment라던지 원하는 모든 쿼리를 볼 수 있는 관계를 정의해줘야 한다.
예시로 만든 seeFullPost (포스트에 대한 전체 내용 보기) 파일을 갖고 와보자~
seeFullPost.graphql
1
2
3
4
5
6
7
8
9
|
type FullPost{
post:Post!
comments: [Comment!]!
likeCount: Int!
}
type Query{
seeFullPost(id:String!):FullPost!
}
|
cs |
seeFullPost.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import { prisma } from "../../../../generated/prisma-client";
import {COMMENT_FRAGMENT} from "../../../fragments";
export default {
Query:{
seeFullPost:async(_,args) => {
const { id } = args;
const post = await prisma.post({id});
// const comments = await prisma.post({ id }).comments();
const comments = await prisma.post({ id })
.comments()
.$fragment(COMMENT_FRAGMENT);
;
const likeCount = await prisma.likesConnection({
where: {post: { id }}
}) //like 내부에 있는 post id 를 기준으로 like을 가져오고
.aggregate() //그 데이터를 묶어서
.count(); //수를 센다
return {
post ,
comments,
likeCount
}
}
}
}
|
cs |
관련 문서는 여기.
또한 관련된 모든 쿼리를 정의하는 대신 prisma 내부의 $fragment API 를 이용 가능하다.
불필요한 관계를 가져오지 않을 수 있고, 확실하게 가져올 수 잇으며
데이터가 없을 때 에러가 안 뜨게 (...?) 가져올 수 있음 (임의의 관계를 만들어 줌)
fragment.js 를 만들어 모듈화 해서 사용했다.
fragment.js
1
2
3
4
5
6
7
8
9
|
export const COMMENT_FRAGMENT = `
fragment CommentParts on Comment {
id
text
user{
username
}
}
`;
|
cs |
역따옴표 하고 fragment 로 선언하고 뫄뫄 on 뭐뭐 요렇게 만드는가 봄.
관련 공식 문서
'Review > 백엔드 - 인스타그램 클론' 카테고리의 다른 글
[Prisma] @relation onDelete 정의 (0) | 2020.02.17 |
---|---|
[Prisma & GraphQL] enum 으로 기능 확장해 사용하기 (0) | 2020.02.17 |
[Prisma] _some, _every, _none, follow 여부 검사 (0) | 2020.02.15 |
[Prisma] custom/computed field (0) | 2020.02.15 |
[Prisma] $exists (0) | 2020.02.11 |