인프런 커뮤니티 질문&답변

pym7857님의 프로필 이미지
pym7857

작성한 질문수

React로 NodeBird SNS 만들기

6-4. 해시태그 검색, 유저 정보 라우터 만들기

sequelize의 include 속성에 대한 질문입니다.

작성

·

411

0

sequelize의 include 속성에 대한 질문입니다.

가령, models폴더안의 post.js를 보면,

post와 user, comment, image, hashtag등등이 Post.associate()라는 함수에서 관계가 정의되어있는데..

질문1)

이렇게 관계가 서로 정해진것들끼리'만' include가 가능한거 맞나요?

좀더 구체적으로 질문을 드리자면, 관계를 정의할때 '1대1' 또는 '1대다' 또는 '다대다' 등등 어떤 관계로 정의를해도 관계만 맺어져있다면 include가 사용가능한것인지 궁금합니다!

질문2) 

models/hashtag.js의 Hashtag.associate에서 Hashtag와 Post의 관계가 다대다로 설정되어있는것을 확인할수있는데,

(routes/hashtag.js)

const posts = await db.Post.findAll({
            include: [{
                model: db.Hashtag,  // 게시글 가져올때 해시태그도 함께 가져오도록.
                where: { name: decodeURIComponent(req.params.name},   // decodeURIComponent(): tag에 한글이 들어오면 URIComponent로 감싸지게 되므로, 그것을 decodeURI 
            }],
        });

여기서 include의 의미가 제대로 이해가 되지않아서 질문드립니다.

조금더 구체적으로 질문을 드리자면...

(models/hashtag.js)

// 관계 설정 
    Hashtag.associate = (db) => {
      db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
    };
    return Hashtag;

위 관계설정 부분에서 '다대다'로 설정을 했고, through를 통해, 'PostHashtag' 라는 테이블이 새로 생겼는데,

mySQL 워크벤치에서 바로 이 'posthashtag'테이블의 필드들을 살펴보면, 'HashtagId'와 'PostId'가 있는것을 확인할 수 있는데요!

그렇다면, 위 첫번째 사진의 include부분에서 req.params로 넘어온 tag name을포함하는 hashtag가 있고, (이부분은 mySQL hashtags테이블의 name필드와 일치하는것 같습니다)

이 hashtag가 posthashtag테이블의 PostId필드에 들어간 후, 그 PostId를 포함하는 post를 최종적으로 뽑아낸게 바로, 첫번째 사진의 const posts = {} 객체 라는건가요 ??? 

너무너무너무 헷갈립니다 ㅠㅠㅠ 저 include라는 의미가 어떤 순서로 작동을 해서 포함관계가 되는것인지 정말 모르겠어서 질문드려요 ...ㅠㅠ

답변 1

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

belongsTo나 hasMany, hasOne, belongsToMany를 지정해준 것들끼리만 include가 가능합니다.

다대다 관계는 중간 테이블이 있어서 헷갈리시는 것 같은데요. hashtag id가 있으면 posthashtag테이블에서 hashtag id와 짝지어지는 post id들이 있을 것입니다. 걔네들이 Posts 배열로 바뀌어서 들어갑니다.

pym7857님의 프로필 이미지
pym7857

작성한 질문수

질문하기