Как найти сущности, где свойство массива идентификаторов содержит определенный идентификатор внутри typeorm - PullRequest
0 голосов
/ 02 марта 2020

Я создаю API-интерфейс graphql, используя nest js, type-graphql и typeorm. У меня проблемы с поиском того, как выполнить определенный запрос. Допустим, у меня есть следующие объекты:

@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, а затем фильтрую этот список, используя include из loda sh в отфильтровать только проекты, содержащие идентификатор пользователя. Разве нет способа добавить какую-либо операцию внутри метода find репозитория проекта, например, «где» или «in», чтобы я мог отфильтровать его непосредственно оттуда вместо ручной фильтрации и использования включений из loda sh? Я даже не знаю, правильно ли это, как я вручную фильтрую?

С уважением,

Джерри

1 Ответ

0 голосов
/ 13 марта 2020

Попробуйте использовать TypeORM QueryBuilder и сделать несколько внутренних объединений для фильтрации проектов, которые не принадлежат выбранному пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...