Sequelize 관계 쿼리

2023. 7. 9. 20:54ORM/Sequelize

include

우리가 SQL 에서 관계 있는 테이블을 불러올 때는 JOIN 을 사용하여 원하는 데아터를 가지고 왔다. 시퀄라이즈에서는 include 를 사용한다.

관계가 있는 모델을 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 outher 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' 카테고리의 다른 글

Sequelize CRUD 쿼리  (0) 2023.07.09
Sequelize 관계 정의하기  (0) 2023.07.09
Sequelize Model  (0) 2023.07.09
Sequelize Migration  (0) 2023.07.09
Sequelize 라이브러리 구성  (0) 2023.07.09