[TIL] 230719

김주희·2023년 7월 19일
1

내배캠 10주차 TIL

목록 보기
3/5

오늘의 목표

  1. 팀 프로젝트 진행 - 내 파트 마무리

▶️ Sequelize alias(as)

  • Users, PetSitterInfos 테이블이 M:N 관계로 참조하는 Reservations 테이블이 있고, Users와 PetSitterInfos를 1:N 관계로 설정해두었다면, 테이블을 include 할때, belongsToMany로 맺어진 관계에서의 데이터를 가져올지, hasMany-belongsTo로 맺어진 관계에서의 데이터를 가져올지 정해줘야 한다.
// 수정 전
// 모델.js
this.belongsTo(models.Users, {
        targetKey: 'id',
        foreignKey: 'userId',
});

// 서비스.js
const petSitters = await this.petSitterInfoRepository.findAllPetSitter({
	attributes: ['id', 'homeType', 'summaryTitle', 'address', 'image'],
	include: [
		{
			model: Users,
            attributes: ['name'],
		},
	],
	order: [['createdAt', 'DESC']],
}); // 결과 : petSitter의 이름이 아닌 해당 petSitter를 예약해둔 사람의 name 값을 가지고 온다

// 수정 후
// 모델.js
this.belongsTo(models.Users, {
        as: 'petSitterUserInfo',
        targetKey: 'id',
        foreignKey: 'userId',
});

// 서비스.js
const petSitters = await this.petSitterInfoRepository.findAllPetSitter({
	attributes: ['id', 'homeType', 'summaryTitle', 'address', 'image'],
	include: [
		{
			as: 'petSitterUserInfo',
            model: Users,
            attributes: ['name'],
		},
	],
	order: [['createdAt', 'DESC']],
});
  • 수정 전 코드에서는 sequelize 자체에서 belongsToMany로 설정되어 있는 테이블(Reservations 테이블을 통해 Users 테이블 접근)을 우선 순위로 가지고 온 듯하다! 우리가 필요한 name은 예약을 한 User의 name이 아닌 petSitterInfo의 name이기 때문에 hasMany-belongsTo 관계 설정의 별칭(alias)을 지정해줘서 데이터를 가지고 오게 하면 된다!
profile
꾸준히 하자

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기