Как можно получить массив данных из базы данных, который будет отфильтрован в соответствии с заданными условиями и иметь разбиение на страницы?

Как я могу реализовать поиск постов, содержащих определенные ключевые слова, и разбить результат на страницы для пагинации? В настоящее время я ищу только по строгому сравнению, но хотел бы искать с помощью метода includes. Вот мой код для получения массива постов из репозитория с использованием NestJS и PostgreSQL:

```typescript
async getAllTutors(identification_post: any, dto: PaginationDto) {
    const [result, total] = await this.repository.findAndCount({
        where: {
            post_text: Like(`%${identification_post}%`)
        },
        skip: (+dto.page - 1) * +dto.limit,
        take: +dto.limit,
    });
}
```

Как я могу изменить этот код, чтобы искать с использованием метода includes?
  • 15 октября 2023 г. 15:18
Ответы на вопрос 2
Для того чтобы использовать метод `includes` вместо строгого сравнения, вы можете использовать оператор `ILIKE` вместо `Like`. Оператор `ILIKE` в PostgreSQL выполняет поиск без учета регистра и является аналогом метода `includes` в JavaScript.

Вот обновленный код для вашего запроса:

```typescript
async getAllTutors(identification_post: any, dto: PaginationDto) {
    const [result, total] = await this.repository.findAndCount({
        where: {
            post_text: ILike(`%${identification_post}%`)
        },
        skip: (+dto.page - 1) * +dto.limit,
        take: +dto.limit,
    });
}
```

Теперь поиск будет осуществляться с использованием метода `includes` вместо строгого сравнения. В результате вы получите массив данных из базы данных, который будет отфильтрован в соответствии с заданными условиями и разбит на страницы для пагинации.
{ 
  where: [
    { post_text: ILike(`%репетитор%`) },
  ],
},
{ 
  import { Repository, EntityRepository } from 'typeorm';
  import { PaginationDto } from './pagination.dto';

  @EntityRepository(YourEntity)
  export class YourEntityRepository {
    constructor() {
      super(YourEntity);
    }

    async getAllTutors(identification_post: string, dto: PaginationDto) {
      const query = this.createQueryBuilder('yourEntityAlias');
      query.where('post_text ILIKE :keyword', { keyword: `%${identification_post}%` });

      const [results, total] = await query
        .take(dto.limit)
        .skip((dto.page - 1) * dto.limit)
        .getManyAndCount();

      return { results, total };
    }
  }
}
Похожие вопросы