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() 不會返回總數

 

 

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