关于解决使用gorm模糊匹配拼接like条件查找不成功的问题
初始的gorm查找
type Option struct {Key stringLikes stringDebug 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%'