Sequelize - M:N 관계에서 through table 활용

BigbrotherShin·2020년 6월 10일
0

Backend

목록 보기
15/15
post-thumbnail

SequelizeM:N관계(belongsToMany)에서 생성되는 through table을 사용하는 방법을 정리하려고 한다.

개요

M:N 관계 정의

참조: Sequelize - M:N 관계, DB config 암호화

Parent.belongsToMany(Child, {
    as: [Relationship],
    through: [Parent_Child] //this can be string or a model,
    foreignKey: 'Parent_rowId'
});

Child.belongsToMany(Parent, {
    as: [Relationship2],
    through: [Parent_Child],
    foreignKey: 'Child_rowId'
});

M:N 관계를 정의할 때는 through를 반드시 지정해줘야 하는데, 만약 through를 through: PostBookmark로 했다면, PostBookmark라는 through tablemysql 데이터베이스에 생성된다.

활용 예시

models/post.js

  Post.associate = (db) => {
    db.Post.belongsToMany(db.User, {
      through: 'PostBookmark',
      as: 'BookmarkUsers',
      foreignKey: 'PostId',
    });
  };

models/user.js

  User.associate = (db) => {
    db.User.belongsToMany(db.Post, {
      through: 'PostBookmark',
      as: 'BookmarkPosts',
      foreignKey: 'UserId',
    });
  };

through table 활용 방법

order: [[db.Sequelize.literal('PostBookmark.createdAt'), 'DESC']],

참조: How to orderby belongsToMany association using the field in the through table? · Issue #7634 · sequelize/sequelize

유저가 북마크한 게시물을 북마크한 순서대로 내림차순으로 정렬하고 싶다. 그러기 위해서는 생성되는 through table인 PostBookmark의 createdAt column을 사용해야 하는데 다음과 같이 하면 된다.

routes/posts.js

router.get('/bookmark', findUser, async (req, res, next) => {
  try {
    const bookmarkPosts = await req.findUser.getBookmarkPosts({
      order: [[db.Sequelize.literal('PostBookmark.createdAt'), 'DESC']],
      include: [
        {
          model: db.Image,
          limits: 1,
        },
      ],
    });
    res.status(200).json(bookmarkPosts);
  } catch (e) {
    console.error(e);
    next(e);
  }
});

References

profile
JavaScript, Node.js 그리고 React를 배우는

0개의 댓글