登录
首页 >  Golang >  Go问答

设计带有多个可选参数的API端点

来源:stackoverflow

时间:2024-02-19 22:21:26 199浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《设计带有多个可选参数的API端点》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在尝试用 go 构建一个 api,它允许用户通过 3 个要点进行搜索来找到“工作”。

  • 文本查询 - 某些字段上的简单 like,例如。标题、描述
  • 位置 - 在连接表 job_location 中查找
  • 技能 - 在连接表 job_skill 中查找

如果用户不提供任何这些,则默认返回表中的所有作业。我觉得我的问题是我所采取的方法不可扩展。有 3 个参数,因此用户可以提供大约 9 种可能的组合。如果我要添加第四个,我就需要覆盖 16 个!搜索组合。

这是我的控制器中的内容:

func (j *Jobs) List(c *client.Client, q string, l string, s string) error {

    // Return all jobs
    if q == "" && l == "" && s == "" {
        err := c.Database.Debug().Preload("Locations").Preload("Skills").Find(&j).Error //
        if err != nil {
            return err
        }
    }

    // Return based on query
    if q != "" && l == "" && s == "" {
        c.Database.Where("LOWER(title) like LOWER(?) OR LOWER(description) like LOWER(?)", "%"+q+"%", "%"+q+"%").Preload("Locations").Preload("Skills").Find(&j)
    }

    // return based on location
    if q == "" && l != "" && s == "" {
        c.Database.Preload("Skills").Preload("Locations").Joins("INNER JOIN job_location jl ON jl.job_id = jobs.id").Where("jl.location_name = ?", l).Find(&j)
    }

    // return based on skill
    if q == "" && l == "" && s != "" {
        c.Database.Preload("Skills").Preload("Locations").Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").Where("js.skill_name = ?", s).Find(&j)
    }

    // return based on query + location
    if q != "" && l != "" && s == "" {
        c.Database.Preload("Locations").Preload("Skills").Joins("INNER JOIN job_location jl ON jl.job_id = jobs.id").Where("jl.location_name = ?", l).Where("LOWER(title) like LOWER(?) OR LOWER(description) like LOWER(?)", "%"+q+"%", "%"+q+"%").Find(&j)
    }

    // return based on query + skill
    if q != "" && l == "" && s != "" {
        c.Database.Preload("Locations").Preload("Skills").Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").Where("js.skill_name = ?", s).Where("LOWER(title) like LOWER(?) OR LOWER(description) like LOWER(?)", "%"+q+"%", "%"+q+"%").Find(&j)
    }

    // return based on location + skill
    if q == "" && l != "" && s != "" {
        c.Database.Preload("Skills").Preload("Locations").Joins("INNER JOIN job_location jl ON jl.job_id = jobs.id").Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").Where("jl.location_name = ?", l).Where("js.skill_name = ?", s).Find(&j)
    }

    // return based on query + skill + location
    if q != "" && l != "" && s != "" {
        c.Database.Preload("Locations").Preload("Skills").Joins("INNER JOIN job_location jl ON jl.job_id = jobs.id").Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").Where("js.skill_name = ?", s).Where("jl.location_name = ?", l).Where("LOWER(title) like LOWER(?) OR LOWER(description) like LOWER(?)", "%"+q+"%", "%"+q+"%").Find(&j)
    }

    return nil
}

正如您所看到的,只有 3 个参数,这是一个巨大的代码块。我可以通过哪些方法来改进这一点,并在添加字段时使其更易于管理。


解决方案


您可以通过创建公共部分来构建查询,然后向其中添加可选部分,如下所示:

func (j *Jobs) List(c *client.Client, q string, l string, s string) error {
    query := c.Database.Debug().Preload("Locations").Preload("Skills")
    // return based on query
    if q != "" {
        query = query.Where("LOWER(title) like LOWER(?) OR LOWER(description) like LOWER(?)", "%"+q+"%", "%"+q+"%")
    }

    // return based on location
    if l != "" {
        query = query.Joins("INNER JOIN job_location jl ON jl.job_id = jobs.id").Where("jl.location_name = ?", l)
    }

    // return based on skill
    if s != "" {
        query = query.Joins("INNER JOIN job_skill js ON js.job_id = jobs.id").Where("js.skill_name = ?", s)
    }

    // Return all jobs
    return query.Find(&j).Error
}

以上就是《设计带有多个可选参数的API端点》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>