Nest 复杂查询

2022-12-22 18:02:30 浏览数 (3)

复杂查询包括分页、模糊查询、多条件筛选、排序等,满足前端对查询的所有诉求。 Nest 复杂查询,主要使用 repository.findAndCount()方法实现。 假设有一个能分页查询所有用户,可根据用户名进行筛选,并对结果按照更新时间倒序排序的需求,它的 controller 如下:

代码语言:javascript复制
  @Post()
  @Roles(Role.Admin, Role.SuperAdmin)
  async pageQuery(@Body() dto: QueryUserDto) {
    const res = await this.userService.pageQuery(dto);
    return successResult(res);
  }

QueryUserDto是查询参数类型

代码语言:javascript复制
// BaseQueryDto.ts
import { IsNotEmpty, IsNumber } from 'class-validator';
export class BaseQueryDto {
  @IsNotEmpty()
  @IsNumber()
  page: number;

  @IsNotEmpty()
  @IsNumber()
  pageSize: number;
}

// QueryUserDto.ts
export class QueryUserDto extends BaseQueryDto {
  username: string;
}

下面来看 UserService如何实现

代码语言:javascript复制
// user.service.ts
async pageQuery(dto: QueryUserDto) {
    const { username, pageSize, page } = dto;
    // 筛选状态为正常的数据
    const queryFilter: any = { status: DATA_STATUS.NORMAL };
    if (username) {
      // 模糊查询 username
      queryFilter.username = Like(`%${username}%`);
    }
    const res = await this.userRepository.findAndCount({
      // 查询条件
      where: queryFilter,
      // 排序
      order: { updateTime: 'DESC' },
      // offset,分页的偏移量
      skip: (page - 1) * pageSize,
      // 每页条数
      take: pageSize,
      // 是否缓存
      cache: true,
    });
    return loadPageQueryResult(res, pageSize);
  }

// 拼接返回结果的数据结构
export function loadPageQueryResult(findAndCountRes: any, pageSize: number) {
  const list = findAndCountRes[0];
  const totalCount = findAndCountRes[1];
  const totalPage = Math.ceil(totalCount / pageSize);
  return {
    list,
    totalCount,
    totalPage,
  };
}

通过 findAndCount()方法可以一次性得到想要的结果,它支持传入多个参数。 where 主要传入查询条件,是一个对象,对象的 key 是数据库字段,value 是要查询的值,把上面的 queryFilter 合并一下,就是如下这种形式,要查多少个属性都可以。

代码语言:javascript复制
{
  status: DATA_STATUS.NORMAL,
  username: Like(`%${username}%`)
}

0 人点赞