node.js - TypeORM. To fremmednøkler som refererer til samme primærnøkkel i én tabell


I prosjektet mitt ønsker jeg å ha bi-direksjonale ManyToOne - OneToMany-relasjoner med to fremmednøkler som refererer til samme primærnøkkel. I mitt tilfelle vil det være en tabell 'match' som inneholder to spillere fra tabellen 'player' (player1Id og player2Id er FK). Jeg vil kunne hente alle kamper der en bestemt spiller spilte, samt tildele en spiller til kampen. I Match-enheten antar jeg at det bør være noe slikt:

@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...

men siden jeg må angi en invers-side enhet i @OneToMany() dekoratøren, hvordan bør det da se ut i Player-entiteten? Finnes det en måte å mappe en slik assosiasjon i TypeORM, og er det en god og vanlig praksis å ha to fremmede nøkler i én tabell som refererer til samme primærnøkkel i en annen tabell? Jeg er ny på NodeJS og webutvikling generelt. Takk for all hjelp.

Svar #1

Dette ser for meg ut som om du har en mange-til-mange-relasjon her. Kamp har mange spillere (selv om du bare trenger to, og i dette tilfellet kan du alltid skalere antall spillere), og en spiller kan delta i mange kamper.

@Entity()
export class Match {

@PrimaryGeneratedColumn()
id!: number;

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

//some other properties...

Spillerentiteten. Hvis du faktisk lager relasjonen mange-til-mange, må du plassere @JoinTable() på en av entitetene.

@Entity()
export class Player{

@PrimaryGeneratedColumn()
id!: number;

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

//some other properties...

Relaterte artikler