nestjs typeorm 条件筛选、排序、分页 常见查询功能的实现

1. 准备工作:注入Repository,创建queryBuilder

@Injectable()
export class TicketDao {

  constructor(
    @InjectRepository(TicketEntity)
    private readonly ticketRepo: Repository<TicketEntity>        // 依赖注入
  ) {}

  async filterAndPageQuery(){
    let qb = this.ticketRepo.createQueryBuilder('ticket')        // 创建queryBuilder
    // 接下来的条件筛选和分页查询代码
  }

}

2. 条件筛选查询,如名称、类型等,传入对应字段即可

qb = qb.where(queryParams as Partial<TicketEntity>)

3. 时间范围筛选

if (updateTimeRange && updateTimeRange.start && updateTimeRange.end) {
  qb = qb.andWhere('update_time BETWEEN :start AND :end', {
    start: updateTimeRange.start,
    end: updateTimeRange.end
  })
}

4. 自定义条件、多重排序

// 普通排序
qb = qb.orderBy('update_time', 'DESC')


// 自定义条件,且多重排序
// 例如:assignee字段为 ${userName} 的优先显示,然后再在此基础上再进行时间和状态的排序
qb = qb
    .orderBy(`case assignee when assignee="${userName}" then 1 else 0 end`)
    .addOrderBy('status', 'ASC')
    .addOrderBy('update_time', 'DESC')

4. 分页

    qb = qb
      .skip(pageParam.pageSize * (pageParam.current - 1))
      .take(pageParam.pageSize)

/* 其中限制获取的条数,用 take 和 limit 都可以,官方给出的文档说明
take: 
     * Sets maximal number of entities to take.
limit:     
     * Set's LIMIT - maximum number of rows to be selected.
     * NOTE that it may not work as you expect if you are using joins.
     * If you want to implement pagination, and you are having join in your query,
     * then use instead take method instead.
因此限制返回条数的话,首先考虑使用take,limit 是 take 的功能子集
*/

5. 获取结果及(非分页的)查询结果总数

return await qb.getManyAndCount()

// 或使用 .getMany() 不会返回总数

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章