如何在typeorm中查找id的数组属性包含某个id的实体

Posted

技术标签:

【中文标题】如何在typeorm中查找id的数组属性包含某个id的实体【英文标题】:How to find entities where an array property of id's contains a certain id within typeorm 【发布时间】:2020-06-14 17:21:29 【问题描述】:

我正在使用 nestjs、type-graphql 和 typeorm 创建一个 graphql api。我无法找出如何进行某个查询。假设我有以下实体:

@Entity()
@ObjectType( description: 'The user model' )
export class User extends BaseEntity 
  @Field(type => ID)
  @PrimaryGeneratedColumn('uuid')
  readonly id: string;

  @Field()
  @Column()
  @IsNotEmpty()
  @IsEmail()
  email: string;

  @Field()
  @IsNotEmpty()
  @Column()
  password: string;

  @Field(type => [Project],  nullable: true )
  @ManyToMany(type => Project)
  @JoinTable()
  projects?: Project[];


@Entity()
@ObjectType( description: 'The project model' )
export class Project extends BaseEntity 
  @Field(type => ID)
  @PrimaryGeneratedColumn('uuid')
  readonly id: string;

  @Field()
  @Column()
  @IsNotEmpty()
  description: string;

  @Field(type => [User],  nullable: true )
  @ManyToMany(type => User)
  @JoinTable()
  participants?: User[];

我有以下服务:

import  includes  from 'lodash';

@Injectable()
export class ProjectService 
  constructor(
    @InjectRepository(Project)
    private projectRepository: Repository<Project>,
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) 
  async loadAllForUser(
    userId: string
  ): Promise<Project[]> 
    const projects = await this.projectRepository.find(
      
          relations: ['participants'],
      ,
    );

    return projects.filter(project =>
      includes(
        project.participants.map(participant => participant.id),
        userId,
      ),
    );
  

这将是我的解析器:

@Resolver( of => Project)
export class ProjectResolver 
  constructor(
    private projectService: ProjectService,
    private userService: UserService,
  ) 
  @Query(returns => [Project])
  @UseGuards(GqlAuthGuard)
  async myProjects(
    @GqlUser() user: User,
  ) 
    return await this.projectService.loadAllForUser(
      user.id,
    );
  

正如您在我的项目服务中看到的,我只是使用 find 方法获取所有项目,然后我使用 lodash 中的包含过滤此列表以仅过滤掉包含用户 ID 的项目。有没有办法在项目存储库的 find 方法中添加某种操作,例如“where”或“in”,以便我可以直接从那里过滤它,而不是手动过滤和使用 lodash 中的包含?我什至不知道我手动过滤的方式是否正确?

亲切的问候,

格里

【问题讨论】:

【参考方案1】:

尝试使用 TypeORM QueryBuilder 并进行一些内部连接来过滤不属于选定用户的项目。

【讨论】:

以上是关于如何在typeorm中查找id的数组属性包含某个id的实体的主要内容,如果未能解决你的问题,请参考以下文章

NestJS TypeORM mongodb 在数组列中查找不起作用

TypeORM查找where子句,如何在多个参数中添加where

从具有相同属性的数组中查找和删除对象

js处理一个数组中包含多个对象,根据对象的一个属性查找到这个对象

查找数组中某个属性值为固定值的是否存在

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