如何在Typeorm中查询数组

时间:2019-10-20 16:47:21

标签: node.js postgresql typescript typeorm

我要创建用户权限管理。我在Postgresql中使用Typeorm。这是用户实体中权限的列定义:

  @Column({
    type: 'text',
    array: true
  })
  permissions: UserPermission[] = [];

这是UserPermission枚举:

export enum UserPermission {
  APP_USER = 'APP_USER',
  USER_ADMIN = 'USER_ADMIN',
  SUPERADMIN = 'SUPERADMIN'
}

我想找到一个拥有'SUPERADMIN'权限的用户,但是在文档/ github问题中找不到正确的位置,该文​​档解释了如何执行此操作。我已经花了一个多小时来做这个,我想这是一个简单的任务。

是否有类似“包含”的内容来检查权限数组是否包含特定元素和/或包含多个元素?

const user = await this.userRepository.findOne({
  where: {
    permissions: Includes('SUPERADMIN')
  }
});

如果有人能指出我正确的文档页面,我将非常感激:)


编辑:

以下对我有用,但我认为这还不是最佳选择:

  @Column('simple-json')
  permissions: string[];
    let user = await this.userRepository.createQueryBuilder('user')
      .where('user.permissions like :permissions', { permissions: `%"${UserPermission.SUPERADMIN}"%`})
      .getOne();

3 个答案:

答案 0 :(得分:5)

您可以使用PostgreSQL array functions

let user = await this.userRepository
  .createQueryBuilder('user')
  .where('user.permissions @> ARRAY[:permissions]', { permissions: UserPermission.SUPERADMIN})
  .getOne();

此外,如果需要查找是否存在多个数组元素,则可以使用散布运算符(请注意...):

.where('user.permissions @> ARRAY[:...permissions]', { permissions: ['foo', 'bar']})

答案 1 :(得分:1)

正如Mykhalio所提到的,您可以使用PostgreSQL数组函数来达到目的。

再添加一些指针。

  1. 如果要同时检查具有USER_ADMIN和SUPER_ADMIN权限的用户。
.where('user.permissions @> :permissions', { permissions:['USER_ADMIN', 'SUPER_ADMIN']})
  1. 如果要检查具有USER_ADMIN或SUPER_ADMIN权限的用户。
.where('user.permissions && :permissions', { permissions: ['USER_ADMIN', 'SUPER_ADMIN']})

答案 2 :(得分:1)

为什么不使用这种方法。为我工作,零错误。

let roles = ['ADMIN', 'STUDENT', SECRETARY];
   let user = await this.userRepository.createQueryBuilder('user')
         .andWhere('user.roles IN (:...roles)')
        .setParameter('roles', ...roles).count()