如何在 TypeORM 中查询数组

Posted

技术标签:

【中文标题】如何在 TypeORM 中查询数组【英文标题】:How do I query an array in TypeORM 【发布时间】:2020-02-16 21:16:35 【问题描述】:

我想创建用户权限管理。我将 TypeORM 与 PostgreSQL 一起使用。这是用户实体中权限的列定义:

@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();

【问题讨论】:

不知道有没有办法使用Include函数,在编辑片段中我建议你使用Like()函数,防止SQL注入: permissions: Like(%$UserPermission.SUPERADMIN%).value )。无论如何将用户权限存储在单独的表中然后建立关系不是更好吗? 【参考方案1】:

您可以使用 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'])

【讨论】:

我收到'操作员不存在:文本@>文本[]'错误【参考方案2】:

正如 Mykhalio 所提到的,您可以使用 PostgreSQL 数组函数来解决问题。

添加更多指针。

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

【讨论】:

感谢您的回答!我正在寻找第二个“where”子句。这对我有用,太棒了!【参考方案3】:

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

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

【讨论】:

你能说出为什么spread operator(...) 与setParameter 和IN 子句中的角色一起使用吗?

以上是关于如何在 TypeORM 中查询数组的主要内容,如果未能解决你的问题,请参考以下文章

如何修复预期值:“1”收到的数组:带有jest框架的TypeORM中的[{“COUNT(*)”:“1”}]错误

TypeORM:如何查询与字符串数组输入的多对多关系以查找所有字符串都应存在于相关实体列中的实体?

过滤从查询参数传递的数组。 NestJS,TypeORM

如何修复预期值:“1”接收到的数组:[“COUNT (*)”:“1”] 在带有 jest 框架的 TypeORM 中出现错误

如何在 NestJs 中捕获 Typeorm 事务错误

NestJS 中的 TypeORM - 如何在实体中获取 MySQL 嵌套对象并对子关系进行“位置”查询?