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