如何在 Typeorm 中查询数组

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 数组函数来实现这一目的。

添加更多指针。

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


小智 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)

  • 您能说出为什么在 setParameter 和 IN 子句中将扩展运算符(...) 与角色一起使用吗? (3认同)

小智 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)

  • 我收到“运算符不存在:文本@>文本[]”错误 (2认同)