- Sequelize의 join은 include를 사용하여 작성한다
- include: [{model: join하려는모델}]
- 관계가설정된 테이블을 대상으로 기본적으로 innerjoin된다
- 관계(relationship)는 아래에서 자세히 다룬다
- 예시코드
const models = require('../models');
models.User.findOne({
where: {id: req.body.id, pw: req.body.pw},
include: [{model: models.Order}]
//대괄호 안에 중괄호 작성
})
//id와 pw를 비교하여 해당하는 user정보와 관계있는 order정보를 join하여 가져오는 중
//설정된 관계에 의거하여 innerjoin이 수행된다
attributes: ["속성이름", "속성이름"]
//대괄호로 작성해야 한다는점 주의
order: [["속성이름", "정렬ASC or DESC"]]
//대괄호 두 개 작성
- 테이블 간 참조를 통해 관계가 연결되도록 설정할 수 있다
- 1:1, 1:N, M:N의 관계가 있다
- 외래키 설정은 model의 index.js에 설정하였다
- PK쪽: hasOne(FK쪽, {foreignKey:"이름"})
- FK쪽: belongsTo(PK쪽, {foreignKey:"이름"})
- onUpdate, onDelete등의 cascade 옵션 추가 가능
PlayerModel.hasOne(ProfileModel, {
foreignKey: "player_id",
onUpdate: "CASCADE",
onDelete: "CASCADE",
});
ProfileModel.belongsTo(PlayerModel, {
foreignKey: "player_id",
onUpdate: "CASCADE",
onDelete: "CASCADE",
});
//Player테이블에 이미 정의된 기본키 player_id를 Profile테이블에서
//외래키로 참고하고 있다
- PK쪽: hasMany(FK쪽, {foreignKey:"이름"})
- FK쪽: belongsTo(PK쪽, {foreignKey:"이름"})
- 고객과 주문테이블과 같은 관계
- 외래키 이름 변경하는 법
(1) 기본키에서 sourceKey: "Pk이름", foreignKey: "바꿀이름"
(2) 외래키에서 target: "참조하는PK이름", foreignKey: "바꿀이름"
(3) DESC해보면 PK쪽 테이블은 원래이름인 team_id, FK쪽 테이블은 teamid로 이름이 설정되어 있다
TeamModel.hasMany(PlayerModel, {
//외래키 이름을 다르게 적을 경우 자동으로 기본키를 외래키로 가져간다
//그래도 sourceKey명시해야한다
sourceKey: "team_id",
foreignKey: "teamid",
});
PlayerModel.belongsTo(TeamModel, {
target: "team_id",
foreignKey: "teamid",
});
- 두 테이블의 기본키를 참조하는 중간 테이블이 필요하다
- belongsToMany(참조테이블,{through: 중간테이블, foreignKey: "내기본키"})
GameModel.belongsToMany(TeamModel, {
through: TeamGameModel,
foreignKey: "game_id",
});
TeamModel.belongsToMany(GameModel, {
through: TeamGameModel,
foreignKey: "team_id",
});
//game_id와 team_id를 외래키로 참조하는 테이블 TeamGame을 생성하고
//위와 같이 설정해준다
참고) TeamGame 테이블 구조
- 생성된 관계를 이용하여 Join을 통해 다양한 정보를 검색할 수 있다
- VS code의 확장프로그램으로 View를 생성하지 않아도 곧바로 server전송 결과를 확인할 수 있다
- 임의의 http파일을 생성하여 이용한다
- 사용법
(1) 메소드 url주소 형식으로 입력하면 send request가 활성화되어 클릭시 사용할 수 있다
(2) app.js실행 후 사용해야한다
(3) @변수명=초기화 형태로 변수를 사용할 수 있다. 변수 표기 형태 -> {{server}}
(4) POST, PATCH 요청시 헤더를 작성해야한다 Content-Type: application/json; charset=UTF-8
(5) Json데이터 형식으로 req.body데이터를 전송할 수 있다
- 예시코드)
PATCH로 Json데이터와 Params를 받아 데이터 업데이트
//server주소와 playerId params는 상단에서 변수로 임의의값이 지정된 상태
PATCH {{server}}/players/{{playerId}}/team
Content-Type: application/json; charset=UTF-8
//body데이터, 헤더와 한줄 띄어야 오류발생안함
{
"teamid": 3
}
http파일코드
try {
const { playerId } = req.params;
const { teamid } = req.body;
//객체 분해 할당
const updatedPlayer = await models.Player.update(
{
//이름과 입력값이름이 같으므로 생략
teamid,
},
{
where: { player_id: playerId },
}
);
console.log(updatedPlayer);
//json, send 어떤 방식이든 무방
res.json(updatedPlayer);
} catch (err) {
//오류발생시 작동
console.log(err);
res.status(500).send("server error");
}
Cmain코드