gorm中有表a,表a中有字段b,c,d,e,f,g,如何实现根据b分页获取a记录且根据c去重
时间: 2024-05-15 17:19:09 浏览: 109
?您可以使用gorm库中的Preload()方法来加载关联模型。首先在模型中定义一个结构体,用于存储筛选条件:
```
type Filter struct {
B string
Page int
Pagesize int
C_map map[string]bool
}
```
然后在查询时使用以下代码:
```
var records []A
var count int64
db := orm.DB
// 定义一个空的筛选条件结构体
filter := &Filter{}
// 获取请求中的筛选条件
err = c.BindJSON(&filter)
if err != nil {
// 返回错误信息
}
// 开始构建查询条件
q := db.Where("b = ?", filter.B)
// 判断是否有c条件,如有则拆分为数组
if filter.C != "" {
cList := strings.Split(filter.C, ",")
filter.C_map = make(map[string]bool)
for _, c := range cList {
filter.C_map[c] = true
}
}
// 过滤c字段,仅保留有效字段
cField := "c"
if len(filter.C_map) > 0 {
cField = fmt.Sprintf("(case %s end)", genCaseString(filter.C_map))
}
q = q.Select("a.*, " + cField)
// 计算记录总数
q.Count(&count)
// 分页查询
if filter.Page > 0 && filter.Pagesize > 0 {
offset := (filter.Page - 1) * filter.Pagesize
q = q.Offset(offset).Limit(filter.Pagesize)
}
// 执行查询
q.Find(&records)
// 返回结果
```
其中,genCaseString()函数用于生成筛选c字段时需要的case语句:
```
func genCaseString(m map[string]bool) string {
var cases []string
for k, _ := range m {
cases = append(cases, fmt.Sprintf("when c = '%s' then true ", k))
}
return strings.Join(cases, "") + "else false end"
}
```
这样,您就可以完成根据b分页获取a记录并根据c去重的需求。
阅读全文