include

우리가 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이 되게 한다.
    }]
})

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
    },
});

참조

[ORM] 📚 Sequelize - left join 하는법