关于解决拼接like的问题

关于解决使用gorm模糊匹配拼接like条件查找不成功的问题

初始的gorm查找

type Option struct {
	Key   string
	Likes string
	Debug bool
}

option := Option{
	Debug:    false,
}

// 这个glbal.DB是我的全局变量
query := global.DB.Where(model)
query.Debug().Where().Find(&list).Where("? like ?%", option.Likes, option.Key)

在我不传入Key 和Likes的时候,没有出现报错,并且查找到的是整个数据库,以下是日志打印:

[0.769ms] [rows:2] SELECT * FROM `user_models` WHERE '' like ''

在我传入Key和Likes的时候,没有出现报错,但是并没有查询到结果,以下是日志打印:

[1.270ms] [rows:0] SELECT * FROM `user_models` WHERE 'nick_name' like 'x'

在我不传入Key,只传入Likes的时候,没有出现报错,但是并没有查询到结果,以下是日志打印:

[0.998ms] [rows:0] SELECT * FROM `user_models` WHERE 'nick_name' like ''

在我不传入Key,只传入Likes的时候,没有出现报错,但是并没有查询到结果,以下是日志打印:

[0.502ms] [rows:0] SELECT * FROM `user_models` WHERE '' like 'x'

很明显,以上结果都不正确,在我查询文档之后,发现gorm的Where()会自动为?占位符添加''单引号,然而sql查询的时候表头字段并不可以添加''单引号,否则查询不正确,所有我们可以使用fmt.Sprintf()函数来进行拼接,但是需要注意的是,sql查询的时候,属性值是需要添加''单引号的,否则会出现报错

Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '% ORDER BY created_at desc LIMIT ?' at line 1
[0.500ms] [rows:0] SELECT * FROM `user_models` WHERE nick_name like x% ORDER BY created_at desc LIMIT 5

以下是正确的查询方式

query.Debug().Where(fmt.Sprintf("%s like '%s%%'", option.Likes, option.Key)).Find(&list)

还可以查询之前添加Likes的默认选项,这样可以防止外部没有传入Likes

if option.Likes == "" {
    option.Likes = "id"
}

日志打印:

[1.000ms] [rows:1] SELECT * FROM `user_models` WHERE nick_name like 'x%'
posted @ 2025-04-01 15:21  小依昂阳  阅读(53)  评论(0)    收藏  举报