如何为带有动态变量的 where 子句编写 gorm 函数

Che*_*tan 4 go go-gorm

我需要创建一个 sql 查询:

SELECT * FROM users WHERE id = 10 AND name = "Chetan"
Run Code Online (Sandbox Code Playgroud)

现在,gorm 的 where 函数如下所示,

// Where return a new relation, filter records with given conditions, accepts `map`, `struct` or `string` as conditions, refer http://jinzhu.github.io/gorm/crud.html#query
func (s *DB) Where(query interface{}, args ...interface{}) *DB {
    return s.clone().search.Where(query, args...).db
}
Run Code Online (Sandbox Code Playgroud)

这意味着它接受查询和参数。例子 :

dbDriver.Where("id = ?", id).First(t)
Run Code Online (Sandbox Code Playgroud)

我如何动态传递多个变量。例子:

SELECT * FROM users WHERE id = 10 AND name = "Chetan"
SELECT * FROM users WHERE id = 10
SELECT * FROM users WHERE gender = "male" AND name = "Chetan" AND age = "30"
Run Code Online (Sandbox Code Playgroud)

是否可以为此类动态 SQL 语句编写单个 gorm 函数?

Ekl*_*vya 7

您可以使用map[string]interface{}for 条件.Where()

\n
m := make(map[string]interface{})\nm["id"] = 10\nm["name"] = "chetan"\ndb.Where(m).Find(&users)\n
Run Code Online (Sandbox Code Playgroud)\n

只需在地图中添加您的条件,然后发送到内部即可where

\n

或者您可以使用 struct 中的.Where(). 创建一个结构变量并设置要查询和发送的字段where

\n
db.Where(&User{Name: "chetan", Gender: "Male"}).First(&user)\n
Run Code Online (Sandbox Code Playgroud)\n

注意:当使用struct查询时,GORM只会查询那些非零值的字段,这意味着如果你的字段\xe2\x80\x99s值为0,\'\',false或其他零值,它将不会\xe2 \x80\x99t 用于构建查询条件。

\n

参考: https: //gorm.io/docs/query.html#Struct-amp-Map

\n