jof*_*rly 5 postgresql node.js typescript typeorm
我想创建用户权限管理。我在 Postgresql 中使用 Typeorm。这是用户实体中权限的列定义:
@Column({
type: 'text',
array: true
})
permissions: UserPermission[] = [];
Run Code Online (Sandbox Code Playgroud)
这是 UserPermission 枚举:
export enum UserPermission {
APP_USER = 'APP_USER',
USER_ADMIN = 'USER_ADMIN',
SUPERADMIN = 'SUPERADMIN'
}
Run Code Online (Sandbox Code Playgroud)
我想找到一位拥有“SUPERADMIN”权限的用户,但我无法在解释如何执行此操作的文档/github 问题中找到正确的位置。我已经为此花费了一个多小时,我想这是一项简单的任务。
是否有类似“包含”的东西来检查权限数组是否包含特定元素和/或包含多个元素?
const user = await this.userRepository.findOne({
where: {
permissions: Includes('SUPERADMIN')
}
});
Run Code Online (Sandbox Code Playgroud)
如果有人可以将我指向正确的文档页面,我将非常感激:)
编辑:
以下对我有用,但我认为它还不是最佳的:
@Column('simple-json')
permissions: string[];
Run Code Online (Sandbox Code Playgroud)
let user = await this.userRepository.createQueryBuilder('user')
.where('user.permissions like :permissions', { permissions: `%"${UserPermission.SUPERADMIN}"%`})
.getOne();
Run Code Online (Sandbox Code Playgroud)
Shi*_*eph 14
正如 Mykhalio 提到的,您可以使用 PostgreSQL 数组函数来实现这一目的。
添加更多指针。
Run Code Online (Sandbox Code Playgroud).where('user.permissions @> :permissions', { permissions:['USER_ADMIN', 'SUPER_ADMIN']})
Run Code Online (Sandbox Code Playgroud).where('user.permissions && :permissions', { permissions: ['USER_ADMIN', 'SUPER_ADMIN']})
小智 11
为什么不使用这种方法。对我来说零错误。
let roles = ['ADMIN', 'STUDENT', SECRETARY];
let user = await this.userRepository.createQueryBuilder('user')
.andWhere('user.roles IN (:...roles)')
.setParameter('roles', ...roles).count()
Run Code Online (Sandbox Code Playgroud)
小智 6
还可以使用高级查找选项在数据库单元中搜索数组值:
const found = await repo.findOne({
where: {
roles: ArrayContains([role]),
},
});
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用 PostgreSQL数组函数
let user = await this.userRepository
.createQueryBuilder('user')
.where('user.permissions @> ARRAY[:permissions]', { permissions: UserPermission.SUPERADMIN})
.getOne();
Run Code Online (Sandbox Code Playgroud)
此外,如果您需要查找多个数组元素的存在,您可以使用扩展运算符(注意...):
.where('user.permissions @> ARRAY[:...permissions]', { permissions: ['foo', 'bar']})
Run Code Online (Sandbox Code Playgroud)