Sequelize - association: where 사용 시 주의점

BigbrotherShin·2020년 5월 14일
0

Backend

목록 보기
12/15
post-thumbnail
post-custom-banner

문제 상황

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하면서 RecommentIdnull인 댓글만 가져오려고 했다. 하지만 댓글이 달려있는 포스트만 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 옵션을 추가해주어야 한다.

References

profile
JavaScript, Node.js 그리고 React를 배우는
post-custom-banner

0개의 댓글