0

在我的应用程序中,每个客户都有自己的数据表。根据选择的客户,我想为 Graphql 查询动态构建表名。

例如:

// Query for customer 1
gql`
  query overviewQuery {
    customer_1 {
      aggregate {
        count
      }
  }
}
`
// Query for customer 2
gql`
  query overviewQuery {
    customer_2 {
      aggregate {
        count
      }
  }
}
`

我在我的 vuex 商店中有客户 ID,并且想在查询中插入一个变量,就像下面的伪代码一样,但它不起作用。

const tblUserAggregateName = `customer_${this.$store.state.customer.customerId`

gql`
  query overviewQuery {
    ${this.tblUserAggregateName} {
      aggregate {
        count
      }
  }
`

是否可以选择如何执行此操作或如何解决此问题?

硬编码所有不同的客户查询并在运行时选择它们不是一个选项。

谢谢!

4

2 回答 2

0

在提到的答案中,动态更改 GraphQL 查询的表名是违反最佳实践的。

由于更改所有客户端的完整数据库结构(它们每个都有一个具有自己的 PostgreSQL 模式名称的单独数据库)不是一个选项,我找到了一个看起来有点 hacky 并且绝对不是最佳实践的解决方案,但我认为我可能会很有趣分享给有同样问题的人。

该方法非常简单:我将查询编写为一个简单的字符串,我可以在其中使用变量并稍后将它们转换为 gql AST 对象graphql-tag

const query = () => {
  const queryString = `
    {
      ${customerId}_table_name {
        aggregate {
           count
        }
      }
  }`

  return gql`${queryString}`
}

有效,但我有更好的解决方案,我很高兴学习!

于 2022-02-06T10:26:12.177 回答
0

您可以提供变量,但不应使用它们来动态推断模式对象名称。这违反了 GraphQL 的核心概念。试试这个:

gql`
  query overviewQuery ($customerId: ID!) {
    customerData (id: $customerId) {
      tableName
      aggregate {
        count
      }
    }
  }`

Apollo 在此处提供了有关如何将变量提供给查询的出色文档:https ://www.apollographql.com/docs/react/data/queries/

然后后端可以使用 customerId 来确定要查询的表。发出请求的客户端不需要知道(也不应该知道)该数据在哪里或如何存储。如果客户端必须知道表名,可以添加一个字段(如示例所示)

于 2022-02-04T00:02:42.613 回答