首页 > 解决方案 > TypeORM 多对多关系高效查询

问题描述

import { Entity, Column, BaseEntity, ManyToMany, JoinColumn, PrimaryColumn } from 'typeorm';

@Entity()
export class Permission extends BaseEntity {
    @PrimaryColumn()
    code: string;
}

@Entity()
export class Role extends BaseEntity {
    @PrimaryColumn()
    code: string;

    @ManyToMany(() => Permission, { cascade: false })
    @JoinColumn()
    permission: Permission[];
}

@Entity('users')
export class User extends BaseEntity {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @Column({ unique: true })
    email: string;

    @ManyToMany(() => Role)
    @JoinColumn()
    roles: Role[];

    @ManyToMany(() => Permission)
    @JoinColumn()
    permissions: Permission[];
}

hasPermission(user: User, code: string): Boolean => {
    // ...
}

我想有效地检查用户是否有权限。即 John 是具有角色['inventoryManager']和权限的用户['listing:delete']。并且角色inventoryManager有权限['listing:read', 'listing:update']。所以,John.hasPermission('listing:update')两者John.hasPermission('listing:delete')都会返回true,而John.hasPermission('listing:create')应该返回false

虽然我可以选择全部然后循环将是一个解决方案,但我认为效率低下且过度选择。

标签: postgresqltypescripttypeormtypeorm-datamappertypeorm-activerecord

解决方案


您是否考虑过使用 QueryBuilder?https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#getting-the-generated-query

然后,您可以查看查询输出并尝试不同的连接和过滤策略并比较它们的效率。


推荐阅读