Sequelize
의 M:N관계(belongsToMany)
에서 생성되는 through table
을 사용하는 방법을 정리하려고 한다.
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 table
이 mysql
데이터베이스에 생성된다.
Post.associate = (db) => {
db.Post.belongsToMany(db.User, {
through: 'PostBookmark',
as: 'BookmarkUsers',
foreignKey: 'PostId',
});
};
User.associate = (db) => {
db.User.belongsToMany(db.Post, {
through: 'PostBookmark',
as: 'BookmarkPosts',
foreignKey: 'UserId',
});
};
order: [[db.Sequelize.literal('PostBookmark.createdAt'), 'DESC']],
유저가 북마크한 게시물을 북마크한 순서대로 내림차순으로 정렬하고 싶다. 그러기 위해서는 생성되는 through table인 PostBookmark의 createdAt column
을 사용해야 하는데 다음과 같이 하면 된다.
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);
}
});