user는 promise를 만드는데 이 때 같이 약속을 한 친구를 등록할 수가 있다.
이 친구 정보는 여러명일 수 있으므로 promise 테이블에 넣지 않고 따로 빼는데,
userId와 promiseId는 friend 테이블을 기준으로 다대다 관계가 된다.
User.belongsToMany(models.Promise, {
as: "friend",
through: "Friend",
foreignKey: "userId",
sourceKey: "userId",
});
Promise.belongsToMany(models.User, {
as: "promise",
through: "Friend",
foreignKey: "promiseId",
sourceKey: "promiseId",
timestamps: false,
});
양쪽에 belongsToMany를 작성하고 through에 테이블을 써주면 해당 테이블이 생성되는 것까지는 저번에도 알았던 내용.
추가된 것들은,
as : 이건 검색을 해봐도 안써도 되는 부분 같은데 나는 이걸 안써주면 에러가 나서 추가하였다.
foreignKey, sourceKey : 이걸 안써주면 각각의 외래키가 UserUserId 이런식으로 생성되었다. 이것까지 써주면 저대로 외래키가 생성된다.
timestamps : 이건 createdat이 friend 테이블에 생성되길래 어디다 작성해야 없앨 수 있는건지 몰라서 일단 둘중 한쪽에만 하나 써봤는데 적용이 되어서 놀랐다. 다른 cascade같은 것도 적용될 것 같은데 이번엔 cascade 안썼는데도 알아서 cascade로 외래키가 생성돼었다.
워크벤치로 확인해보니 다음과 같이 의도대로 잘 생성되었다.
다대다 관계로 생성된 테이블은 모델 파일이 따로 존재 하지 않는다. 그래서 그런지 models/index.js를 require해와도 해당 이름으로 쿼리메소드들을 쓰려고 하면 오류가 난다.
https://sequelize.org/docs/v6/advanced-association-concepts/advanced-many-to-many/
공식문서를 보면 모델을 생성한다는 거 같은데 일단 지금은 안된다.
그래서 임시적? 해결방법.
const db = require("../../sequelize/models");
const Friend = db.sequelize.models.Friend;
이와 같이 해당 레포지토리에 명시해주면 쿼리가 잘 동작한다.
https://sequelize.org/docs/v6/core-concepts/assocs/#special-methodsmixins-added-to-instances
아니면 공식문서에 써있는 이러한 스페셜 메소드를 써보면 먹힐지도.