使用GORM框架分页查询5张表里label字段值为1的数据,并存在total结构体里
时间: 2024-02-03 21:11:58 浏览: 126
假设5张表的结构体分别为Table1、Table2、Table3、Table4和Table5,label字段的类型为int,可以按照以下步骤进行分页查询:
1. 创建一个total结构体,包含所有5张表中label字段值为1的记录总数:
```go
type Total struct {
Count int64 `json:"count"`
}
```
2. 在每张表的结构体中添加一个方法,用于返回该表中label字段值为1的记录总数:
```go
func (t *Table1) CountLabel1(db *gorm.DB) (int64, error) {
var count int64
err := db.Model(&Table1{}).Where("label = ?", 1).Count(&count).Error
if err != nil {
return 0, err
}
return count, nil
}
// 同样地,在Table2、Table3、Table4和Table5的结构体中也添加类似的方法
```
3. 在分页查询的API中,依次调用每张表的CountLabel1方法,将返回的记录总数求和,得到所有5张表中label字段值为1的记录总数:
```go
func GetLabel1Data(db *gorm.DB, page int, size int) ([]interface{}, *Total, error) {
var (
data []interface{}
total Total
)
// 计算每张表中label字段值为1的记录总数
count1, err := (&Table1{}).CountLabel1(db)
if err != nil {
return nil, nil, err
}
count2, err := (&Table2{}).CountLabel1(db)
if err != nil {
return nil, nil, err
}
count3, err := (&Table3{}).CountLabel1(db)
if err != nil {
return nil, nil, err
}
count4, err := (&Table4{}).CountLabel1(db)
if err != nil {
return nil, nil, err
}
count5, err := (&Table5{}).CountLabel1(db)
if err != nil {
return nil, nil, err
}
// 计算所有5张表中label字段值为1的记录总数
total.Count = count1 + count2 + count3 + count4 + count5
// 分页查询每张表中label字段值为1的数据,并将数据合并到一个切片中
err = db.Where("label = ?", 1).Offset((page - 1) * size).Limit(size).Find(&data, &Table1{}).Error
if err != nil {
return nil, nil, err
}
err = db.Where("label = ?", 1).Offset((page - 1) * size).Limit(size).Find(&data, &Table2{}).Error
if err != nil {
return nil, nil, err
}
err = db.Where("label = ?", 1).Offset((page - 1) * size).Limit(size).Find(&data, &Table3{}).Error
if err != nil {
return nil, nil, err
}
err = db.Where("label = ?", 1).Offset((page - 1) * size).Limit(size).Find(&data, &Table4{}).Error
if err != nil {
return nil, nil, err
}
err = db.Where("label = ?", 1).Offset((page - 1) * size).Limit(size).Find(&data, &Table5{}).Error
if err != nil {
return nil, nil, err
}
return data, &total, nil
}
```
4. 在调用GetLabel1Data函数时,传入需要查询的页码和每页记录数即可:
```go
data, total, err := GetLabel1Data(db, 1, 10)
if err != nil {
// 处理错误
}
fmt.Println(total.Count) // 打印所有5张表中label字段值为1的记录总数
fmt.Println(data) // 打印第1页每张表中label字段值为1的数据
```
阅读全文