우리가 SQL에서 관계있는 Table을 불러올 때는 JOIN을 사용하여 원하는 데이터를 가지고 왔다. Sequelize에서는 include를 사용하면 된다.
→ 배열인 이유는 다양한 모델과 관계가 있을 수 있기 떄문이다.
const findPosts = await Posts.findAll({
// 컬럼 나열
attributes: ['postId', 'userId', 'title', 'createdAt', 'updatedAt'],
include: [
{
model: Users, // posts에 없는 컬럼을 join을 통해 가져오기
attributes: ['nickname'], // nickname 가져오기
},
],
order: [['createdAt', 'DESC']], // 생성순으로 정렬
});
include를 사용하면 기본적으로 Inner join으로 되며, left outer join으로 사용하고 싶은 경우, required:false 옵션을 주어야 한다.
Shop.findAll({
where: {id:shopId},
include: [{
model: ShopAd,
as: 'ads',
where: { is_valid: 1, is_vertify: 1 },
required: false // left outer join이 되게 한다.
}]
})
include나 관계 쿼리 메서드에도 where나 attributes 같은 옵션들을 사용할 수 있다.
아래는 id가 1인 댓글만 가져오고, 그 중에서도 id 컬럼만 가져오도록 하고 있다.
const user = await User.findOne({
include: [{ // left outer join
model: Comment, // join할 모델
attributes: ['id'], // select해서 표시할 필드 지정
where: {
id: 1, // on Comment.id = 1
},
}]
});
// 또는
const comments = await user.getComments({ // user가 comments를 get한다. (user와 comments는 관계되어 있다.)
attributes: ['id'], // select해서 표시할 필드 지정
where: {
id: 1, // on Comment.id = 1
},
});