노드 학습 15일차
안녕하세요 🐸
관계 쿼리
SQL의 JOIN의 역할을 하는 기능을 시퀄라이즈에서도 사용할 수 있으며 크게 두 가지 방법을 사용할 수 있습니다.
include
시퀄라이즈의 조회 기능에 include
를 통해 JOIN
과 비슷한 기능을 사용할 수 있습니다.
1
2
3
4
5
6
7
8
9
const user = await User.findOne({
include:[
{
model:Comment
}
]
});
console.log(user.Comments);
여기서 했갈리기 쉬운 포인트 입니다.
user.Comment
가 아닌user.Comments
로 복수형을 사용함.include
는 배열을 전달. 여러 관계 모델을 포함할 수 있기 때문.- 변수가
user
는 첫 글자가 소문자이지만, 관계 모델Comment
의 첫 글자는 대문자
Comments
인 이유는 User
모델과 Comment
모델이 일대다 관계이기 때문에 User는 다수의 Comment 를 가질 수 있기 때문에 시퀄라이즈가 이를 자동으로 이름을 지어 사용합니다.
get 함수 사용
시퀄라이즈에서 모델의 관계를 함수로 만들어줍니다.
1
2
3
const user = await User.findOne({});
const comments = await user.getComments();
console.log(comments);
시퀄라이즈에서 User
모델과 Comment
모델의 관계를 처리하여 getComments()
함수가 생성되어 이를 사용할 수도 있습니다.
여기서도 두 모델의 관계가 일대다 관계이기 때문에 getComment
가 아닌 getComments
임을 주의합니다.
as
구문으로 별칭 설정
모델의 관계를 설정할 때 as 구문을 통해 모델의 별칭을 지어줄 수 있습니다.
여기서 지어진 별칭은 앞서 설명한 get함수에도 영향을 끼칩니다.
예시로 관계를 설정할 때 다음과 같이 설정했다고 가정합니다.
1
db.User.hasMany(db.Comment,{foreignKey:'commenter',sourceKey:'id',as:'Answers'})
위와 같이 했다면 이제 Comment 모델은 Answer 로 이름을 사용하기로 했으므로 관계 쿼리에도 다음과 같이 영향을 끼칩니다.
1
2
const user = await User.findOne({});
const answers = await user.getAnswers();
주의할점
include 구문을 사용하는 경우에는 모델의 원래 이름을 사용해야 합니다. as
구문을 통해 모델의 별칭을 지어줘도 모델의 이름은 변함이 없기 때문입니다.
생성 쿼리
관계 모델의 생성 쿼리는 크게 두 가지 방법이 있습니다.
- create 할 때 부터 관계를 명시 하는 방법
- create 한 자료의 관계를 만들어주는 방법
create 할 때 부터 관계를 명시 하는 방법
다음 예시에서 User 모델과 Comment 모델의 FK는 commenter 입니다.
1
2
3
4
const user = await User.findOne({});
const comment = await Comment.create({
commenter : user.id
});
이렇게 되면 Comment 데이터는 생성됨과 동시에 user에 관계를 가집니다.
create 한 자료의 관계를 만들어주는 방법
add+모델명 함수를 사용하여 관계를 정의할 수도 있습니다.
1
2
3
4
5
const user = await User.findOne({});
const comment = await Comment.create();
await user.addComment(comment);
await user.addComment(comment.id);
위의 예시와 같이 comment 자체를 사용할수도 있고, comment의 id를 사용할 수도 있습니다.
그리고 여러 개를 추가할 때에는 다음과 같이 배열로 추가할 수 있습니다.
1
2
3
4
const user = await User.findOne({});
const comment1 = await Comment.create();
const comment2 = await Comment.create();
await user.addComment([comment1,comment2]);
여기서 했갈릴 수 있는게, 앞서 시퀄라이즈가 일대다 관계 모델들의 관계 쿼리는 복수형으로 이름을 만들어줬는데 여기서는 단수형입니다. 이 점에 주의합니다.