100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
package dao
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
|
||
"github.com/gogf/gf/v2/database/gdb"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
)
|
||
|
||
// ParsePage 解析分页参数
|
||
func ParsePage(pageNum, pageSize int) (offset, limit int) {
|
||
if pageNum < 1 {
|
||
pageNum = 1
|
||
}
|
||
if pageSize < 1 {
|
||
pageSize = 20
|
||
}
|
||
if pageSize > 1000 {
|
||
pageSize = 1000
|
||
}
|
||
offset = (pageNum - 1) * pageSize
|
||
limit = pageSize
|
||
return
|
||
}
|
||
|
||
// InsertAndGetId 插入并返回自增ID(排除 id 字段让 SQLite 自增)
|
||
func InsertAndGetId(ctx context.Context, table string, data interface{}) (id int64, err error) {
|
||
r, err := g.DB().Model(table).Ctx(ctx).FieldsEx("id").Data(data).Insert()
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return r.LastInsertId()
|
||
}
|
||
|
||
// Update 更新数据
|
||
func Update(ctx context.Context, table string, data interface{}, where interface{}) (err error) {
|
||
_, err = g.DB().Model(table).Ctx(ctx).Data(data).Where(where).Update()
|
||
return
|
||
}
|
||
|
||
// Delete 删除数据
|
||
func Delete(ctx context.Context, table string, where interface{}) (err error) {
|
||
_, err = g.DB().Model(table).Ctx(ctx).Where(where).Delete()
|
||
return
|
||
}
|
||
|
||
// GetById 根据主键查询
|
||
func GetById(ctx context.Context, table string, id int, result interface{}) error {
|
||
r, err := g.DB().Model(table).Ctx(ctx).Where("id", id).One()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if r == nil {
|
||
return nil
|
||
}
|
||
return r.Struct(result)
|
||
}
|
||
|
||
// Count 计数
|
||
func Count(ctx context.Context, table string, where interface{}) (int, error) {
|
||
return g.DB().Model(table).Ctx(ctx).Where(where).Count()
|
||
}
|
||
|
||
// buildFilters 构建过滤条件, 跳过 @order 特殊键
|
||
// 注意: "field like" 键使用 WhereLike(GoFrame v2 原生支持),value 不需要包裹 %
|
||
func buildFilters(m *gdb.Model, filters []interface{}) *gdb.Model {
|
||
if len(filters) > 0 {
|
||
for k := 0; k < len(filters); k += 2 {
|
||
if k+1 < len(filters) {
|
||
if key, ok := filters[k].(string); ok && key != "@order" {
|
||
if strings.HasSuffix(key, " like") {
|
||
field := strings.TrimSuffix(key, " like")
|
||
if val, ok := filters[k+1].(string); ok {
|
||
m = m.WhereLike(field, val)
|
||
}
|
||
} else {
|
||
m = m.Where(key, filters[k+1])
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return m
|
||
}
|
||
|
||
// extractOrder 从 filters 中提取 @order 排序参数
|
||
func extractOrder(filters []interface{}) string {
|
||
for k := 0; k < len(filters); k += 2 {
|
||
if k+1 < len(filters) {
|
||
if key, ok := filters[k].(string); ok && key == "@order" {
|
||
if s, ok := filters[k+1].(string); ok {
|
||
return s
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return ""
|
||
}
|