인프런 커뮤니티 질문&답변

Haewoong Lee님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

join한 테이블 조회시 컬럼이 겹치는 문제

해결된 질문

작성

·

225

0

아래와 같은 코드에서 memberID를 조건으로 데이터를 조회하면 join된 campground와 member 각각에 member 컬럼이 다 있어 조건으로 넣어준 memberId를 어디서 찾아야 하는지 typeORM에서 인식하지 못하는 것 같습니다. 때문에 아래와 같은 에러가 나오는거 같습니다. 어떻게 해결해야 할까요?

result = await this.dibsRepository.find({
                where: {
                    member: { memberId },
                },
                relations: ['campground', 'member'],
            });

QueryFailedError: Column 'memberId' in where clause is ambiguous

답변 1

0

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! Haewoon님!

올려주신 코드에서는 member 테이블의 memberId를 찾고 있네요!

result = await this.dibsRepository.find({
                where: {
                    member: { memberId },
                },
                relations: ['campground', 'member'],
            });

 

만약, 위 코드에서, campground 테이블에 존재하는 memberId를 찾길 원하신다면 아래와 같이 변경해 보세요!

result = await this.dibsRepository.find({
                where: {
                    campground: { memberId },
                },
                relations: ['campground', 'member'],
            });

 

만약, 위 코드에서 campground 테이블에 존재하는 memberId를 찾고, dibs 테이블에서 qqq컬럼을, campground 테이블에서 zzz컬럼을 조회하고 싶다면, 아래와 같은 방법을 응용해 보세요!

result = await this.dibsRepository.find({
                select: {
                    qqq: true
                    campground: { zzz: true }
                },
                where: {
                    campground: { memberId },
                },
                relations: ['campground', 'member'],
            });

 

Haewoong Lee님의 프로필 이미지
Haewoong Lee
질문자

답변 감사합니다. 현재 Dibs 테이블은 아래와 같습니다. 저는 member에 있는 memberId를 기준으로 데이터를 조회하고 싶었습니다. 지금 join한 campground에서도 member를 또 외래키로 쓰고 있습니다. 그래서 join해서 불러온 데이터들에 member가 총 두개가 존재하기 때문에 어떤 member를 인식해야 하는지 typeORM에서 인식하지 못해 발생한 오류 같습니다. 이 경우 해결할 방법이 있을까요?

@Entity()
@ObjectType()
export class Dibs {
    @ManyToOne(() => Member)
    @PrimaryColumn({ name: 'memberId' })
    @JoinColumn({ name: 'memberId' })
    @Field(() => Member)
    member: Member;

    @ManyToOne(() => Campground)
    @PrimaryColumn({ name: 'campgroundId' })
    @JoinColumn({ name: 'campgroundId' })
    @Field(() => Campground)
    campground: Campground;

    @DeleteDateColumn()
    deletedAt: Date;
}

 

@Entity()
@ObjectType()
export class Campground {
    @PrimaryGeneratedColumn('uuid')
    @Field(() => String)
    campgroundId: string;

    @Column({ nullable: false })
    @Field(() => String)
    campName: string;

    @Column({ nullable: false, default: 0 })
    @Field(() => Int)
    hits: number;

    @Field(() => Member)
    @JoinColumn({ name: 'memberId' })
    @ManyToOne(() => Member)
    member: Member;

    @DeleteDateColumn()
    deletedAt: Date;
}
Haewoong Lee님의 프로필 이미지
Haewoong Lee
질문자

해결되었습니다.

아래와 같이 queryBuilder를 사용해서 join된 테이블에 명확한 이름을 설정해주고 조건식을 사용하니 됐습니다.

result = await this.dibsRepository
  .createQueryBuilder('dibs')
  .leftJoinAndSelect('dibs.campground', 'campground')
  .leftJoinAndSelect('dibs.member', 'dibsMember')
  .where('dibsMember.memberId = :memberId', { memberId })
  .getMany();