【问题标题】:How do I query an array in TypeORM如何在 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 })。无论如何将用户权限存储在单独的表中然后建立关系不是更好吗?

标签: node.js postgresql typescript typeorm


【解决方案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 数组函数来解决问题。

添加更多指针。

  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']})

【讨论】:

  • 感谢您的回答!我正在寻找第二个“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 子句中的角色一起使用吗?
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 2021-10-15
  • 2022-08-17
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多