【问题标题】:Typeorm refactor blacklisting. One entity relationTypeorm 重构黑名单。一实体关系
【发布时间】:2019-12-25 20:14:34
【问题描述】:

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

简单用例:登录用户可以将另一个用户“列入黑名单”,因此我需要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,一些建议/直接帮助将非常感激。

【问题讨论】:

    标签: node.js typeorm


    【解决方案1】:

    确实,我找到了更好/更简单的方法:

    我删除了黑名单实体和用户中的关系。 我在我的用户实体中添加了这个:

    @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() 中的两列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2021-10-27
      • 2021-01-05
      • 2019-12-30
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多