【发布时间】:2019-11-06 19:22:06
【问题描述】:
我是 golang 开发的新手。我有 6 个参数要使用 gorm 传递给查询。这是选择查询,因此,我们需要根据输入值过滤值。因此,我们需要将过滤器动态传递给查询。我试过了,但没有解决办法。
func GetUsers(DB *gorm.DB, Offset int, Limit int, User uibackendmodels.UserDetails) (Users []uibackendmodels.UserDetails, Err error) {
query := "SELECT userid, username, nickname, email, mobile, location, status, roleids, trsids, brandids, languagecode, createdat, createdby, modified, modifiedby" +
" FROM users WHERE 1=1 "
if User.UserName != "" || User.NickName != "" {
nameQuery := "("
if User.UserName != "" {
nameQuery = nameQuery + " username LIKE " + "'" + User.UserName + "%'"
}
if User.NickName != "" && User.UserName != "" {
nameQuery = nameQuery + " OR nickname LIKE " + "'" + User.NickName + "%'"
} else if User.NickName != "" {
nameQuery = nameQuery + " nickname LIKE " + "'" + User.NickName + "%'"
}
query = query + " AND " + nameQuery + ")"
}
if User.BrandIDs != nil && len(User.BrandIDs) > 0 {
brandIds := "("
for i := range User.BrandIDs {
if len(User.BrandIDs) == (i + 1) {
brandIds = brandIds + "'" + User.BrandIDs[i] + "' = ANY (brandids) "
} else {
brandIds = brandIds + "'" + User.BrandIDs[i] + "' = ANY (brandids) OR "
}
}
query = query + " AND " + brandIds + ")"
}
if User.TRSIDs != nil && len(User.TRSIDs) > 0 {
trsIds := "("
for i := range User.TRSIDs {
if len(User.TRSIDs) == (i + 1) {
trsIds = trsIds + "'" + User.TRSIDs[i] + "' = ANY (trsids) "
} else {
trsIds = trsIds + "'" + User.TRSIDs[i] + "' = ANY (trsids) OR "
}
}
query = query + " AND " + trsIds + ")"
}
if User.RoleIDs != nil && len(User.RoleIDs) > 0 {
roleIds := "("
for i := range User.RoleIDs {
if len(User.RoleIDs) == (i + 1) {
roleIds = roleIds + strconv.FormatInt(int64(User.RoleIDs[i]), 10) + " = ANY (roleids) "
} else {
roleIds = roleIds + strconv.FormatInt(int64(User.RoleIDs[i]), 10) + " = ANY (roleids) OR "
}
}
query = query + " AND " + roleIds + ")"
}
if User.Status != "" {
query = query + " AND status = " + "'" + EnumToString(User.Status) + "'"
}
query = query + " AND status != 'deleted' ORDER BY modified desc LIMIT " + strconv.Itoa(Limit) + " OFFSET " + strconv.Itoa(Offset)
if err := DB.Raw(query).Scan(&Users).Error; err != nil {
return nil, err
}
return Users, nil
}
我需要在上面的查询中动态添加参数。
【问题讨论】: