72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
package common
|
||
|
||
import (
|
||
"context"
|
||
"time"
|
||
|
||
"github.com/gogf/gf/v2/database/gdb"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
)
|
||
|
||
// BaseDao 是所有 dao 的基类:单表操作统一入口,查询缓存由 dao 层按需配置。
|
||
type BaseDao struct {
|
||
Table string
|
||
}
|
||
|
||
func (d *BaseDao) Model() *gdb.Model { return g.DB().Model(d.Table) }
|
||
|
||
func (d *BaseDao) InsertAndReturnId(ctx context.Context, data g.Map) (int64, error) {
|
||
res, err := d.Model().Ctx(ctx).Data(data).Insert()
|
||
if err != nil {
|
||
return 0, err
|
||
}
|
||
return res.LastInsertId()
|
||
}
|
||
|
||
func (d *BaseDao) UpdateByPk(ctx context.Context, pk int64, data g.Map) error {
|
||
_, err := d.Model().Ctx(ctx).WherePri(pk).Data(data).Update()
|
||
return err
|
||
}
|
||
|
||
// ContentCache 内容查询缓存选项:TTL 来自配置 database.cache.ttl,≤0 回退 300 秒。
|
||
func (d *BaseDao) ContentCache(ctx context.Context) gdb.CacheOption {
|
||
ttl := g.Cfg().MustGet(ctx, "database.cache.ttl").Int()
|
||
if ttl <= 0 {
|
||
ttl = 300
|
||
}
|
||
return gdb.CacheOption{Duration: time.Duration(ttl) * time.Second}
|
||
}
|
||
|
||
// GetOne 执行单行查询,用 goframe 自带转换(Record.Struct,orm tag 优先)转为结构体;
|
||
// 记录不存在返回 nil, nil。dao 层把构建好的 model(含条件/排序/缓存)传入。
|
||
func GetOne[T any](m *gdb.Model) (*T, error) {
|
||
rec, err := m.One()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if rec.IsEmpty() {
|
||
return nil, nil
|
||
}
|
||
dst := new(T)
|
||
if err = rec.Struct(dst); err != nil {
|
||
return nil, err
|
||
}
|
||
return dst, nil
|
||
}
|
||
|
||
// GetList 执行多行查询,用 goframe 自带转换(Result.Structs)转为结构体切片;无记录返回空切片。
|
||
func GetList[T any](m *gdb.Model) ([]*T, error) {
|
||
recs, err := m.All()
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if len(recs) == 0 {
|
||
return []*T{}, nil
|
||
}
|
||
var items []*T
|
||
if err = recs.Structs(&items); err != nil {
|
||
return nil, err
|
||
}
|
||
return items, nil
|
||
}
|