V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
xiaoming1992
V2EX  ›  JavaScript

求助 nestjs many-to-many 查询失败

  •  
  •   xiaoming1992 · 2021-11-27 03:45:38 +08:00 · 1292 次点击
    这是一个创建于 1097 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有两个 Entity:

    @Entity()
    export class UserEntity {
      @Column({ unique: true, nullable: false })
      id: string
    
      @ManyToMany(() => RoleEntity, (r) => r.users, {
        cascade: true,
      })
      @JoinTable()
      roles?: RoleEntity[]
    }
    
    
    @Entity()
    export class RoleEntity {
      @Column({ unique: true, nullable: false })
      name: string
    
      @ManyToMany(() => UserEntity, (u) => u.roles)
      users?: UserEntity[]
    }
    

    我想构造一个查询:

    api.user.search({
      roles: [
        'admin',
        'vip',
      ],
    })
    

    通过传递 RoleEntity.name 数组, 能查询到所有拥有这些 role 的 user, 只要 search.roles 和 user.roles 存在交集就能查询出来

    也就是说, 王小明的 roles 是 ['loser', 'vip'], 而我查询 ['admin', 'vip'], 那么, 王小明也应该被查询出来, 因为他是 vip

    但是我的方法报错 Cannot query across many-to-many for property roles, 我的方法是:

    userRepo.findAndCount({
      where: {
        roles: {
          name: Raw((alias) => `${alias} @> ARRAY[:...roles]`, { roles: ['admin', 'vip'] }),
        }
      }
    })
    

    网上只有关于 roles 是数组时的查询, 但是我的 roles 是 Entity 数组, 是 many-to-many, 我只是个菜鸟前端, 实在搞不来了, 大佬们救救孩子吧

    xiaoming1992
        1
    xiaoming1992  
    OP
       2021-11-27 20:07:32 +08:00
    做到了

    userRepo.createQueryBuilder('user')
    .leftJoin('user.roles', 'role')
    .andWhere('role.name IN (:...roles)', { roles })
    .getMany()
    xiaoming1992
        2
    xiaoming1992  
    OP
       2021-11-27 20:11:42 +08:00
    @xiaoming1992 擦,并不是。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3323 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:02 · PVG 20:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.