node.js - 类型ORM。两个外键在一个表中引用相同的主键

标签 node.js typescript nestjs typeorm

在我的项目中,我希望具有双向 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 的新手。感谢您的帮助。

最佳答案

在我看来,您在这里拥有多对多关系。 Match 有很多玩家(即使你只需要两个,这你总是可以扩展玩家的数量),并且一个玩家可以参加很多场比赛。

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

关于node.js - 类型ORM。两个外键在一个表中引用相同的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510569/

相关文章:

javascript - Nest Js TypeORM repository.update 方法不更改对象的多个字段

node.js - 错误: Nest cannot export component/module that is not a part of the currently processed module (DatabaseModule)

javascript - 如何仅从 Nodejs 中的数据库列值返回值

css - react / typescript : Idiomatic code for custom components that merge attributes?

typescript - 如何使用 typescript 不重复代码?

error-handling - RxJS 重试然后 catchError 不起作用

node.js - 尽管文件监视正在工作,但无法在浏览器中启用带有react-hot的HotModuleReplace插件

node.js - 使用 JWT token 。有更好的方法吗?

javascript - Node.js:如何远程调试?

typescript 重复导入 'moment'