router.get('/', async (req, res, next) => {
//GET /api/posts
const posts = await db.Post.findAll({
include: [
{
model: db.Comment,
where: { RecommentId: { [Op.is]: null } },
}
]
})
포스트를 가져오면서 대댓글은 가져오지 않고, 댓글만 Comments에 넣어서 가져오기 위해서 Comment model을 include하면서 RecommentId
가 null
인 댓글만 가져오려고 했다. 하지만 댓글이 달려있는 포스트만 DB에서 로드되고 댓글이 달려있지 않은 포스트는 로드되지 않았다.
관련된 Stack Overflow 답변을 참고하여 문제를 해결할 수 있었다.
router.get('/', async (req, res, next) => {
//GET /api/posts
const posts = await db.Post.findAll({
include: [
{
model: db.Comment,
required: false, // where에 맞지 않는 sub-model이더라도 parent model을 가져옴
where: { RecommentId: { [Op.is]: null } },
}
]
})
a where clause on a related model will create an inner join and return only the instances that have matching sub-models. To return all parent instances, you should add required: false for more detail check nested-eager-loading
where
절을 사용하면 조건에 맞는 sub-model이 존재할 때만 parent-model을 가져오는 것이 기본값이다. 따라서 조건에 맞지 않는 sub-model이 있더라도 모든 parent-model을 가져오기 위해서는 required: false
옵션을 추가해주어야 한다.