我想在我的应用中实施用户黑名单。
简单用例:登录的用户可以“黑名单”另一个用户,因此我需要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,一些建议/直接帮助将不胜感激。
答案 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()中的两列。