TypeORM — получение объектов с предоставленным идентификатором, который находится на расстоянии одного отношения

#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 }
        }
      }
    });