【问题标题】:How can I add query parameters dymanically using gorm?如何使用gorm动态添加查询参数?
【发布时间】: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

}

我需要在上面的查询中动态添加参数。

【问题讨论】:

    标签: java go go-gorm


    【解决方案1】:

    在 GORM 中,您可以通过丰富 Object 并将其传递给函数来处理基本输入,类似于:

    // Would get the First user with Name="jinzhu" and Age="20"
    db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
    

    当你不能使用 GORM 的默认函数来表达你的语句的一部分时,你可以使用普通的 SQL 和方法链:

    // Would get the first User with Name="jinzhu" and id in (4,5,6,7)
    ids := [4]int{4,5,6,7}
    db.Where(&User{Name: "jinzhu"}).Where("id IN (?)", ids).First(&user)
    

    您还可以使用变量链接方法

    base := db.Where(&User{Name: "jinzhu"})
    if someThing {
        base = base.Where("id IN (?)", ids) // Adding this condition just if someThing is true
    }
    base.First(&user) // Query your results
    

    More Information about Method Chaining

    【讨论】:

    • 嗨@Alex。谢谢你的回复。我试过这个,但它不适合我的任务。如果输入参数来自前端,我们需要在查询中传递值,否则不需要。我有 text[] 概念。因为我需要根据即将到来的数组来检索数据。
    • 您好 Vinodh,我添加了一些有关使用变量的方法链接的信息。这应该符合您的情况。如果没有,我想我没有得到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多