Как присоединиться к таблице в TypeORM с помощью службы innerJoinAndSelect

#node.js #typescript #nestjs #typeorm

#node.js #typescript #nestjs #typeorm

Вопрос:

Сущность -pin

 @Entity()
export class Pin {
  @PrimaryGeneratedColumn()
  @PrimaryColumn()
  id: string;

  @Column({name: 'town_name'})
  townName: string;

  @Column()
  state_id: string;

  @ManyToOne(() => State, state => state.stateId)
  state: State;
}
  

Сущность -состояние

 @Entity()
export class State {

  @PrimaryGeneratedColumn({name: 'state_id'})
  @PrimaryColumn()
  stateId: string;

  @Column({name: 'state_name'})
  stateName: string;

}
  

Обслуживание:

 const pin = pinRepository.createQueryBuilder('pin').leftJoinAndSelect('pin.state','state').getQuery();
    console.log(pin);
  

Я новичок в nest и TypeORM и пытаюсь объединить две таблицы. но он возвращает неверный запрос:

 SELECT "pin"."id" AS "pin_id","pin"."town_name" AS "pin_town_name", "pin"."state_id" AS "pin_state_id", "pin"."stateStateId" AS "pin_stateStateId", "state"."stateId" AS "state_stateId", "state"."state_name" AS "state_state_name" FROM "pin" "pin" LEFT JOIN "state" "state" ON "state"."stateId"="pin"."stateStateId"
  

Хотя я бы хотел, чтобы что-то запрашивало подобное:

 select id, town_name, Pin.state_id, state_name from Pin inner join State ON Pin.state_id = State.state_id
  

В какой части я передал что-то не то? или есть какой-нибудь способ преодолеть эту проблему.

Комментарии:

1. Что не так в запросе? Что это left join вместо inner join ?

2. не было столбца «pin».»stateStateId», это должно быть взято из state.StateName

3. что следует взять из StateName? у вас есть StateID в качестве основного столбца в состоянии. Я опубликовал ответ, пожалуйста, просмотрите и прокомментируйте, если это уместно.

Ответ №1:

Я не совсем уверен, с какими проблемами вы боретесь, но следующее должно сработать. Я думаю, что проблема заключается в определении отношения сущностей.

Взгляните на @JoinColumn

 // pin.entity.ts

@Entity()
export class Pin {
  @PrimaryGeneratedColumn()
  id: string;

  @Column({name: 'town_name'})
  townName: string;

  @Column()
  state_id: string;

  @ManyToOne(() => State, state => state.pins)
  @JoinColumn({ name: 'state_id' })
  state: State;
}
  
 // state.entity.ts

@Entity()
export class State {

  @PrimaryGeneratedColumn({name: 'state_id'})
  stateId: string;

  @Column({name: 'state_name'})
  stateName: string;

  @OneToMany(() => Pin, pin => pin.state)
  pins: Pin[]

}
  

Кроме того, измените left на inner join.

 const pin = await pinRepository.createQueryBuilder('pin')
.innerJoinAndSelect('pin.state','state')
.getMany()