• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

시퀄라이즈 관계성 맺은 테이블 수정 질문

23.02.28 18:35 작성 조회수 227

0

안녕하세요 선생님.

시퀄라이즈에서 모델 끼리 관계성을 맺어서 route에서 const post = await Post.create({'이하 생략'}); 이런 식으로 하면 Post가 Hashtag와 관계성이 있을 때 post.addHashtags를 할 수 있다는건 알겠는데..이건 create시에만 쓸 수 있는 건가요?

이런 질문을 드리는 이유는 게시글에서 해시태그를 수정하려 하니까 일단 Post.update를 해야 하는데, 그러면 따로 Hashtag테이블에 있는 해시태그를 수정하려니까 중간 테이블이 있어서 쉽지 않을것 같아 그냥 row query로 Hashtag중간테이블에서 게시글 아이디를 지워버리고 다시 해시태그를 생성하려고 post.addHashtags를 사용하고 싶어서 그렇습니다.

 

답변 1

답변을 작성해보세요.

0

find한 대상에서도 add같은 게 전부 존재합니다.

뉸뉴님 상황에서는 setHashtags 쓰시면 될 듯 한데요. 기존 관계들을 지우고 새로 관계설정하는 메서드입니다.

뉸뉴님의 프로필

뉸뉴

질문자

2023.03.01

답변 감사합니다. 제가 add함수가 없냐고 여쭤본 이유가 post.addHashtags is not a function 이라고 떠서요...setHashtags도 같은 에러가 뜨는데, set이나 add함수 쓸 때 안에 들어가는 데이터를 콘솔로 찍어서

 [
  [
    Hashtag {
      dataValues: [Object],
      _previousDataValues: [Object],
      uniqno: 1,
      _changed: Set(0) {},
      _options: [Object],
      isNewRecord: false
    },
    false
  ],
  [
    Hashtag {
      dataValues: [Object],
      _previousDataValues: [Object],
      uniqno: 1,
      _changed: Set(0) {},
      _options: [Object],
      isNewRecord: false
    },
    false
  ],
  [
    Hashtag {
      dataValues: [Object],
      _previousDataValues: [Object],
      uniqno: 1,
      _changed: Set(0) {},
      _options: [Object],
      isNewRecord: false
    },
    false
  ]
]

이렇게 나오는걸 확인했는데도 is not function에러가 뜨는건 왜 그런 건가요 선생님? 강의에서 말씀하신 것처럼 함수 안에

await post.addHashtags(result.map((v) => v[0]));

이렇게 넣었는데도 그렇습니다

테이블간 관계성은 노드버드와 다를것 없는데

post 모델에서는

 db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag'}); 

이렇고,

hashtag모델에서는

 db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });

이렇거든요.

모델 부분에서 오타가 난 것도 아닌것 같은게, create할 때는 addHashtags함수가 잘만 작동됩니다 선생님ㅠㅠㅠ

 

post는 아떻게 선언하신건가요?

뉸뉴님의 프로필

뉸뉴

질문자

2023.03.01

   const post = await Post.update({
      content: req.body.content,
      lookName: req.body.lookName,
      top: req.body.top,
      bottom: req.body.bottom,
      dress: req.body.dress,
      outer: req.body.outer,
      shoes: req.body.shoes,
      acc: req.body.acc   
    }, {where: {id: req.body.postId}});

이렇게 선언했습니다

뉸뉴님의 프로필

뉸뉴

질문자

2023.03.01

선생님 제가 정의한 post객체가 프로미스 객체를 할당한다고 해서 update실행 성공 후, Post.findByPk(req.body.postId);로 새 객체를 정의하고 거기다가 setHashtags를 사용하는 방법으로 해결하였습니다

네네 update 자체는 post를 return하지 않아서(적어도 mysql에서는) 새로 find해서 생성하셔야 합니다.