Files
36Wisdom/common/base_dao.go
T
2026-08-14 16:11:10 +08:00

72 lines
1.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.Structorm 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
}