#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()