Typeorm重构黑名单。一种实体关系

时间:2019-08-20 15:05:13

标签: node.js typeorm

我想在我的应用中实施用户黑名单。

简单用例:登录的用户可以“黑名单”另一个用户,因此我需要user.blacklist每个黑名单中的用户ID的数组。

我的后端是用TypeOrm制作的,这是我的用户实体:

export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsEmail()
  email: string;

  @Column()
  @Length(3, 21)
  pseudo: string;

  @Column()
  @Length(4, 100)
  password: string;

  // ...

  @OneToMany(() => Blacklist, (blacklist) => blacklist.user)
  blacklist: Blacklist[];

  @ManyToMany(() => Blacklist)
  @JoinTable()
  blacklists: Blacklist[];
}

您可以看到我尝试了一些操作,这是我的黑名单实体:

export class Blacklist {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => User, (user) => user.blacklist)
  user: User;

  @ManyToMany(() => User, (user) => user.blacklists)
  users: User[]
}

这实际上在起作用。但是我不会这样,因为它非常丑陋而且非常糟糕。

我的(mysql)数据库看起来像这样:

| user       | blacklist   | user_blacklists_blacklist |
|------------|-------------|---------------------------|
| id         | id          | userId                    |
| pseudo     | userId      | blacklistId               |
| ...        |             |                           |

我希望这样:

| user       | blacklist        | 
|------------|------------------|
| id         | id               |
| pseudo     | userId           |
| ...        | blacklistedUserId|

至少我不太在乎数据库,但与黑名单实体中的用户有2种关系,我想这要简单得多。

我尝试使用@Tree,但不起作用,我只希望孩子将黑名单的用户假冒孩子,但无论如何它都会创建父级。

这是我第一次使用TypeOrm,一些建议/直接帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

实际上,我发现了一种更好/更简单的方法:

我删除了黑名单实体和用户中的关系。 我将其添加到我的User实体中:

@ManyToMany(() => User, (user) => user.blacklisted)
@JoinTable({
   name: 'user_blacklist',
   joinColumn: {
     name: 'userId',
     referencedColumnName: 'id',
  },
  inverseJoinColumn: {
     name: 'blacklistedUserId',
     referencedColumnName: 'id',
  },
})
blacklist: User[];

@ManyToMany(() => User, (user) => user.blacklist)
blacklisted: User[];

仅此而已。我只有一个user_blacklist表,其中包含@JoinTable()中的两列。