TypeORM. Два внешних ключа, ссылающиеся на один первичный ключ в одной таблице - PullRequest
0 голосов
/ 29 апреля 2020

В моем проекте я хотел бы иметь двунаправленные отношения ManyToOne - OneToMany с двумя внешними ключами, ссылающимися на один и тот же первичный ключ. В моем случае это будет таблица «матч», которая содержит двух игроков из таблицы «игрок» (player1Id и player2Id - FK). Я хочу иметь возможность получать все матчи, в которых играл конкретный игрок, а также назначать игрока на матч. Я полагаю, что в объекте Match это должно быть примерно так:

@Entity()
export class Match {

@PrimaryGeneratedColumn()
id!: number;

@ManyToOne((type) => Player)
@JoinColumn({ name: "player1Id", referencedColumnName: "id" })
player1: Player;

@ManyToOne((type) => Player)
@JoinColumn({ name: "player2Id", referencedColumnName: "id" })
player2: Player;
//some other properties...

, но так как я должен указать одну сущность обратной стороны в декораторе @OneToMany (), как он должен выглядеть в объекте Player? Есть ли способ отобразить такую ​​связь в TypeORM, и является ли хорошей и распространенной практикой иметь два FK в одной таблице, ссылающихся на один и тот же первичный ключ в другой таблице? Я новичок в NodeJS и webdev в целом. Спасибо за любую помощь.

1 Ответ

1 голос
/ 01 мая 2020

Мне кажется, у вас здесь есть отношение многие ко многим. В матче много игроков (даже если вам нужно только два, и в этом вы всегда можете масштабировать количество игроков), и игрок может участвовать во многих матчах.

@Entity()
export class Match {

@PrimaryGeneratedColumn()
id!: number;

@ManyToMany((type) => Player, (player) => player.matches)
players: Player[];

//some other properties...

Сущность игрока. Если вы действительно связываете многих со многими, вы должны поместить @JoinTable() в одну из сущностей.

@Entity()
export class Player{

@PrimaryGeneratedColumn()
id!: number;

@ManyToMany((type) => Match, (match) => match.players)
@JoinTable()
matches: Match[];

//some other properties...
...