如何动态构建查询过滤器

时间:2020-01-19 17:16:48

标签: go graphql dgraph dgraph-dgo

我正在使用Go设置自己的API。由于我是如何编写代码以动态创建/应用查询过滤器的,所以我现在有些困惑。它可以工作,但是我想知道是否有更好的方法来完成下面的方案。

例如,我有一个带有复选框的搜索页面(用于电子邮件的1个和用于名称的1个)以缩小搜索范围。

unsigned

这是我到目前为止得到的,我认为有更好的方法可以做到这一点:

// If I checked the email, the query would be like this
query findOne() {
  user(func: type(user)) @filter(eq(email, "john.doe@email.com")) {
    name
    email
    age
    home_address
  }
}

// If name checkedbox is also checked, it would be like this
query findOne() {
  user(func: type(user)) @filter(eq(email, "john") OR eq(name, "john")) {
    name
    email
    age
    home_address
  }
}

有没有比创建长期条件更好的方法了?

1 个答案:

答案 0 :(得分:2)

我建议如下所述重构您的过滤器逻辑:

package main

import (
    "fmt"
    "strings"
)

func getQuery(key, val string, filters *[]string) {
    if val != "" {
        *filters = append(*filters, fmt.Sprintf(`eq("%s", "%s")`, key, val))
    }
}
func main() {
    var filters []string
    email := "demo@demo.com"
    mobileNumber := "123456789"

    getQuery("email", email, &filters)
    getQuery("mobileNumber", mobileNumber, &filters)
    filter := strings.Join(filters, " OR ")
    fmt.Println(filter)
}