GORM 链式查询详解
GORM 支持链式调用构建复杂查询,本文介绍其核心用法。
什么是链式查询
链式查询是通过连续调用多个查询方法,逐步添加条件,最终执行查询的编程模式。
链式调用规则
Go
db.Select("name, age").
Where("age > ?", 18).
Where("status = ?", "active").
Order("age DESC").
Limit(10).
Find(&users)
链式调用中的每个方法返回
*gorm.DB,可继续调用其他方法,直到调用 Find/First/Take 等执行方法。
常用链式方法
Select - 选择字段
Go
// 选择特定字段
db.Select("name, age").Find(&users)
// 排除字段
db.Select("*").Omit("password, created_at").Find(&users)
Where - 查询条件
Go
// 等值查询
db.Where("name = ?", "张三").First(&user)
// 多条件 AND
db.Where("age > ?", 18).Where("status = ?", "active").Find(&users)
// IN 查询
db.Where("id IN ?", []int{1, 2, 3}).Find(&users)
// 结构体查询
db.Where(&User{Name: "张三", Status: "active"}).Find(&users)
Order - 排序
Go
// 单字段排序
db.Order("age DESC").Find(&users)
// 多字段排序
db.Order("age DESC, name ASC").Find(&users)
Group - 分组
Go
// 分组查询
db.Select("age, COUNT(*) as count").
Group("age").
Having("COUNT(*) > ?", 1).
Find(&results)
链式组合示例
Go
db.Model(&User{}).
Select("id, name, age, status").
Where("age BETWEEN ? AND ?", 20, 40).
Where("status IN ?", []string{"active", "pending"}).
Where("name LIKE ?", "%张%").
Order("age DESC").
Group("status").
Having("COUNT(*) > ?", 0).
Limit(20).
Find(&users)
注意事项
- 链式方法不调用执行方法(Find/First等)不会产生 SQL 查询
- 多个 Where 默认是 AND 关系,OR 需用
Or()方法 Model()方法指定查询目标,链式调用中可省略- 链式调用中的条件顺序影响 SQL 生成顺序
要点总结
- 链式调用通过连续方法构建查询,最终调用执行方法
- Select/Where/Order/Group/Limit 等方法返回
*gorm.DB - 多个 Where 是 AND 关系,Or 方法实现 OR
- 链式不调用执行方法不会产生数据库查询
文章存放路径:D:\git2\jwdev\articles\GORM\进阶\高级查询技术\链式查询详解.md
📝 发现内容有误?点击此处直接编辑