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
}
详细解释
-
创建基础查询对象:
db := global.GVA_DB.Model(&system.SysOperationRecord{}) -
添加条件查询:
- 如果
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)
}
- 如果
-
计算总数:
err = db.Count(&total).Error
if err != nil {
return
} -
获取数据:
- 按照
id倒序排序:db.Order("id desc") - 设置分页参数:
db.Limit(limit).Offset(offset) - 预加载
User关联:db.Preload("User") - 执行查询并将结果存储在
sysOperationRecords中:err = db.Find(&sysOperationRecords).Error
- 按照
总结
这些条件搜索语句是组合在一起的,每一个 db.Where(...) 语句都会将条件添加到查询中,最终的查询将会包含所有的条件。这种方式可以灵活地根据不同的搜索条件构建查询语句,从而实现复杂的搜索功能。