123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package utils
-
- import (
- "strconv"
- )
-
- type PageNaviEngine struct {
- ctx *Context
- }
-
- func NewPageNaviEngine(ctx *Context) *PageNaviEngine {
- return &PageNaviEngine{ctx: ctx}
- }
-
- // GetPageList 获取列表
- func (t *PageNaviEngine) GetPageList(target interface{}, sql string, limit []int, sqlArgs ...interface{}) (int64, error) {
- countSQL := "select count(*) as cnt from (" + sql + ") as virtualTable"
- countSQLorArgs := []interface{}{countSQL}
- for _, arg := range sqlArgs {
- countSQLorArgs = append(countSQLorArgs, arg)
- }
-
- cntRes, err := t.ctx.DB.Query(countSQLorArgs...)
- if err != nil {
- return 0, err
- }
-
- cntStr := string(cntRes[0]["cnt"])
- cnt, _ := strconv.ParseInt(cntStr, 10, 64)
-
- newSQL := t.PackLimitToSQL(sql, limit)
-
- err = t.ctx.DB.SQL(newSQL, sqlArgs...).Find(target)
- if err != nil {
- return 0, err
- }
-
- return cnt, nil
- }
-
- // PackLimitToSQL 添加 limit 语句到 sql 最后
- func (t *PageNaviEngine) PackLimitToSQL(sql string, limit []int) string {
- switch len(limit) {
- case 1:
- return sql + " LIMIT " + strconv.Itoa(limit[0])
- case 2:
- return sql + " LIMIT " + strconv.Itoa(limit[0]) + " OFFSET " + strconv.Itoa(limit[1])
- default:
- return sql
- }
- }
|