TypeORM / Postgres - включить все в отношение, где хотя бы один соответствует требованиям - PullRequest
0 голосов
/ 05 мая 2020

Я очень новичок в SQL / TypeORM в целом, и в настоящее время я сталкиваюсь с проблемой, когда я хочу загрузить участников матча, связанных с совпадением, в котором хотя бы один участник имеет переданный идентификатор пользователя. Запрос можно представить как «Загрузить все мои матчи с моими противниками». У меня есть три таблицы:

publi c .match << OneToMany >> publi c .match_participant << ManyToOne >> publi c .user

Пока что я пошел о выполнении:

select * from public.match m
left join public.match_participant mp on mp."matchId" = m.id
left join public.user u on u.id = mp."userId"
where u.id = 3

и в typeORM

    repository
      .createQueryBuilder('match')
      .leftJoinAndSelect('match.participants', 'participants')
      .leftJoinAndSelect('participants.user', 'user')
      .where('user.id=:id')
      .setParameter('id', 1)
      .getMany();

Что, конечно, загружает все совпадения, участников и пользователей для этого конкретного userId, но другие участники не включены. Я считаю, что что-то вроде "подзапроса" может быть полезно, но я не могу понять этого.

Любая помощь приветствуется!

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 мая 2020

После кучи проб и ошибок я узнал, как преобразовать чистый запрос в построитель. Решение было таким:

matchRepository
      .createQueryBuilder('match')
      .innerJoin(
        query => {
          return query
            .from(MatchParticipant, 'p')
            .select('p."matchId"')
            .where('p."userId" = :id');
        },
        'selfMatch',
        '"selfMatch"."matchId" = match.id',
      )
      .leftJoinAndSelect('match.participants', 'participants')
      .leftJoinAndSelect('participants.user', 'user')
      .setParameter('id', id)
      .getMany();
0 голосов
/ 11 мая 2020

Я не думаю, что вам даже нужен для этого построитель запросов.

@Entity()
class Match {
  @OneToMany(...)
  participants: MatchParticipant[];
}

@Entity()
class MatchParticipant {
  @ManyToOne(...)
  match: Match;

  @ManyToOne(...)
  participant: Participant;
}

@Entity()
class User {
  @OneToMany(...)
  matches: MatchParticipant[];
}

// ...

repository.manager.find(MatchParticipant, { where: { match: { participants: { participant: { id } } } } });
...