gpt4 book ai didi

go - 编写具有多个可选参数的 API 端点

转载 作者:行者123 更新时间:2023-12-03 10:09:45 24 4
gpt4 key购买 nike

我正在尝试在 Go 中构建一个 API,它允许用户搜索 3 个要点以找到“工作”。

  • 文本查询 - 简单 LIKE在某些领域,例如。标题、说明
  • 位置 - 在连接表中查找 job_location
  • 技能 - 在连接表中查找 job_skill

  • 如果用户不提供任何这些,则默认返回表中的所有作业。我觉得我的问题是我采用的方法不可扩展。有 3 个参数,因此用户可以提供大约 9 种可能的组合。如果我要添加第四个,我需要覆盖 16 个!搜索组合。
    这是我的 Controller 中的内容:
    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 个参数,这是一个巨大的代码块。有什么方法可以改进这一点,并在添加字段时使其更易于管理。

    最佳答案

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

    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
    }

    关于go - 编写具有多个可选参数的 API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66024160/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com