在 GORM 中,你可以通过 Where
方法结合多个条件来查询符合条件的记录列表。Where
方法支持 AND
和 OR
条件,并且可以链式调用以构建复杂的查询。
示例代码:
假设你有一个 User
结构体,并希望根据多个条件查询符合条件的记录列表。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
Age int
}
func main() {
dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
var users []User
// 示例1:AND 条件查询
db.Where("name = ? AND age = ?", "John Doe", 30).Find(&users)
fmt.Println("Users with name 'John Doe' and age 30:", users)
// 示例2:OR 条件查询
db.Where("name = ?", "John Doe").Or("age = ?", 25).Find(&users)
fmt.Println("Users with name 'John Doe' or age 25:", users)
// 示例3:使用 map 传递多个条件 (AND 条件)
db.Where(map[string]interface{}{"name": "John Doe", "age": 30}).Find(&users)
fmt.Println("Users with name 'John Doe' and age 30 (using map):", users)
// 示例4:链式查询多个条件
db.Where("name = ?", "John Doe").Where("age = ?", 30).Find(&users)
fmt.Println("Users with name 'John Doe' and age 30 (using chained Where):", users)
}
解释:
1.AND 条件查询:
db.Where("name = ? AND age = ?", "John Doe", 30).Find(&users)
使用 SQL 的 AND
语法,查询 name
为 "John Doe"
且 age
为 30
的记录。
2. OR 条件查询:
db.Where("name = ?", "John Doe").Or("age = ?", 25).Find(&users)
使用 Or
方法添加 OR
条件,查询 name
为 "John Doe"
或 age
为 25
的记录。
3.使用 map
传递多个条件:
db.Where(map[string]interface{}{"name": "John Doe", "age": 30}).Find(&users)
通过 map
传递多个条件,这些条件默认是 AND
关系。
4.链式调用多个 Where
条件:
db.Where("name = ?", "John Doe").Where("age = ?", 30).Find(&users)
通过链式调用 Where
方法,可以添加多个条件,每个 Where
方法都是一个 AND
条件。
复杂查询示例:
如果你有更复杂的查询需求,比如在一个条件组中使用 AND
,另一个条件组中使用 OR
,可以使用 Where
方法组合和嵌套条件:
db.Where("name = ? AND (age = ? OR age = ?)", "John Doe", 30, 25).Find(&users)
这个示例查询 name
为 "John Doe"
并且 age
为 30
或 25
的记录。