진행
테이블간의 관계설정
관계설정하는 이유는 테이블간의 무결성을 유지하기위해(좀 더 연관성있게 ex)부모 테이블 삭제시 자식 테이블도 삭제)
관계설정 방법에는 2가지가 있는데
마이그레이션과 모델 파일 모두 수정하는 방법과 //내가 함
마이그레이션을 하지않고 모델만을 사용하는 방법이 있다 //팀장님이 함
내가한 방법만 기술할것이고 다른 방법은 나중에 기술.
예를 들어 user가 여러개의 trip을 간다면 1:N 형태이다
그렇다면 trip table에 user_id가 외래키로 존재해야한다
1:N 세팅하는 법
일반적인 모델만드는
npx sequelize-cli model:generate --name User --attributes name:string
이거는 마이그레이션 파일과 모델 파일 모두 생성되는데 이거 말고
npx sequelize-cli migration:generate --name fk-trip
처럼해주면 마이그레이션만 생성되는데
해당 마이그레이션에 user와 trip의 관계의 경우
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn("trip", "user_id", {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: "user", // user 모델에서
key: "id", // 그 아이디 값을 참고합니다.
},
onUpdate: "CASCADE",
onDelete: "CASCADE", //부모 삭제시 자식도 삭제해주는 옵션
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeColumn(
"trip", // name of Source model
"user_id" // key we want to remove
);
},
};
처럼 작성해준다 diary table에 user_id컬럼을 추가해준다. (중요 : diary에 마이그레이션시 직접 user_id를 생성해주는것이 아님)
그리고 models/index.js에
db.user.hasMany(db.trip, { foreignKey: "user_id", sourceKey: "id" });
db.trip.belongsTo(db.user, { foreignKey: "user_id", targetKey: "id"});
처럼 관계를 설정해준다
부모 테이블인 user는 hasMany
자식 테이블인 trip은 belongsTo
N:M관계에서는 belongsToMany설정을 해준다
이러면 1:N 관계 설정은 끝났고
N:M의 경우에는
마찬가지로 마이그레이션을 만들어 주고 위의코드처럼 up과 down을 작성해주는데 join table이니까
두개씩 써준다
예시
"use strict";
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.addColumn("diary_hashtag", "diary_id", {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: "diary",
key: "id",
},
onUpdate: "CASCADE",
onDelete: "CASCADE",
});
await queryInterface.addColumn("diary_hashtag", "hashtag_id", {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: "hashtag",
key: "id",
},
onUpdate: "CASCADE",
onDelete: "CASCADE",
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.removeColumn(
"diary_hashtag", // name of Source model
"diary_id" // key we want to remove
);
await queryInterface.removeColumn(
"diary_hashtag", // name of Source model
"hashtag_id" // key we want to remove
);
},
};
그리고 models/index.js에는
db.diary.belongsToMany(db.hashtag, {
through: "diary-hashtag",
foreignKey: "diary_id",
sourceKey: "id",
});
db.hashtag.belongsToMany(db.diary, {
through: "diary-hashtag",
foreignKey: "hashtag_id",
sourceKey: "id",
});
를 써줘서 관계설정을 마무리해준다
'Project > codestates-first-project' 카테고리의 다른 글
8~9 일차 / 마무리 (0) | 2022.04.19 |
---|---|
7일차 / AWS이용한 환경변수 설정 (0) | 2022.04.13 |
5일차 / MVC 모델 (0) | 2022.04.09 |
4일차 / HTTPS인증과 도메인구입 (route53) (0) | 2022.04.08 |
3일차 / 보완한 SR (0) | 2022.04.08 |