Skip to main content

gorm 语句拼装

是的,这些条件搜索语句是组合在一起的。Gorm 的查询构建器允许你通过链式调用的方式组合多个查询条件。每一个 db = db.Where(...) 语句都会返回一个新的 db 对象,并且包含了之前所有的查询条件。因此,这些条件会被组合在一起应用到最终的查询中。

下面是一个示例,展示了这些条件是如何组合在一起的:

func (operationRecordService *OperationRecordService) GetSysOperationRecordInfoList(info systemReq.SysOperationRecordSearch) (list interface{}, total int64, err error) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
// 创建db
db := global.GVA_DB.Model(&system.SysOperationRecord{})
var sysOperationRecords []system.SysOperationRecord

// 如果有条件搜索 下方会自动创建搜索语句
if info.Method != "" {
db = db.Where("method = ?", info.Method)
}
if info.Path != "" {
db = db.Where("path LIKE ?", "%"+info.Path+"%")
}
if info.Status != 0 {
db = db.Where("status = ?", info.Status)
}

// 计算总数
err = db.Count(&total).Error
if err != nil {
return
}

// 获取数据
err = db.Order("id desc").Limit(limit).Offset(offset).Preload("User").Find(&sysOperationRecords).Error
return sysOperationRecords, total, err
}

详细解释

  1. 创建基础查询对象

    db := global.GVA_DB.Model(&system.SysOperationRecord{})
  2. 添加条件查询

    • 如果 info.Method 不为空,则添加 method 条件:
      if info.Method != "" {
      db = db.Where("method = ?", info.Method)
      }
    • 如果 info.Path 不为空,则添加 path 条件,并使用 LIKE 进行模糊匹配:
      if info.Path != "" {
      db = db.Where("path LIKE ?", "%"+info.Path+"%")
      }
    • 如果 info.Status 不为 0,则添加 status 条件:
      if info.Status != 0 {
      db = db.Where("status = ?", info.Status)
      }
  3. 计算总数

    err = db.Count(&total).Error
    if err != nil {
    return
    }
  4. 获取数据

    • 按照 id 倒序排序:
      db.Order("id desc")
    • 设置分页参数:
      db.Limit(limit).Offset(offset)
    • 预加载 User 关联:
      db.Preload("User")
    • 执行查询并将结果存储在 sysOperationRecords 中:
      err = db.Find(&sysOperationRecords).Error

总结

这些条件搜索语句是组合在一起的,每一个 db.Where(...) 语句都会将条件添加到查询中,最终的查询将会包含所有的条件。这种方式可以灵活地根据不同的搜索条件构建查询语句,从而实现复杂的搜索功能。