#api #nestjs #typeorm
#API #nestjs #typeorm
Вопрос:
Я хочу получать объекты из таблицы, предоставляющей идентификатор, который связан с таблицей, которая находится в другом отношении. Это выглядит так:
Рука связана с действием ManyToOne (рука может иметь только одно действие), действие связано с ситуацией ManyToOne (действие может иметь только одну ситуацию)
Я пытаюсь сделать запрос GET для раздач, в которых я предоставляю situationId.
Упрощенные объекты:
@Entity()
export class Hand {
@PrimaryGeneratedColumn()
hand_id: number;
@Column()
hand: string;
@ManyToOne(type => Action, action => action.simplifiedhands, { eager: true, onDelete: 'CASCADE', onUpdate: 'CASCADE' })
action: Action;
}
@Entity()
export class Action {
@PrimaryColumn()
action_id: number;
@ManyToOne(type => Situation, situation => situation.actions, { onDelete: 'CASCADE', onUpdate: 'CASCADE' })
@JoinColumn({name: 'situation'})
situation: Situation;
@OneToMany(type => Hand, hand => hand.action)
hands: Hand[];
@OneToMany(type => Hand, hand => hand.action)
hands: Hand[];
}
@Entity()
export class Situation {
@PrimaryColumn()
situation_id: number;
@ManyToOne(type => Strategy, strategy => strategy.situations, { onDelete: 'CASCADE', onUpdate: 'CASCADE' })
strategy: Strategy;
@OneToMany(type => Action, action => action.situation)
actions: Action[];
}
Какие подходы пока не сработали для меня (только примеры вариантов):
return await this.handsRepository.find({
relations: ["action", "action.situation"],
where: {
"situation": id
}
});
и
return await this.handsRepository.find({
join: {
alias: "hands",
leftJoinAndSelect: {
"action": "hand.action",
"situation": "action.situation"
}
},
where: {
"situation": id
}
});
Как правило, оба «работают», но предоставляют все записи, как будто не было условия where.
Комментарии:
1. Не могли бы вы, пожалуйста, прикрепить код объектов?
2. О да, конечно, добавлено
3. Помог ли приведенный ниже ответ вам решить проблему?
4. Я сделал это другим способом. Я получаю объект ситуации с массивом действий, содержащих массивы рук.
Ответ №1:
Ключи в объекте, которому вы назначаете, where
должны быть членами объекта репозитория, в вашем случае, Hand
поскольку situation
это элемент действия, он не работает. Я удивлен, что вы не упомянули ни о каких ошибках.
Вы можете сделать одно из следующих действий (пример для postgres)
Использование построителя запросов:
return await this.handsRepository.createQueryBuilder(Hand, 'hand')
.leftJoin('hand.action', 'action')
.leftJoin('action.situation', 'situation')
.where('situation.id = :id', { id })
.getMany();
Или вы можете попробовать следующее (успех не гарантирован):
return await this.handsRepository.find({
relations: ["action", "action.situation"],
where: {
action: {
situation: { id }
}
}
});