如何使用不同的字段生成相同的graphql查询

时间:2019-02-11 17:52:13

标签: graphql react-apollo apollo-client

我正在使用graphql-tag,所以我将使用该语法。

让我们说我有这个查询:

const query = gql`
 query user(id: String) {
  user(id: $id) {
   id
  }
 }
`

如果在不同的调用上重用同一查询文档节点,什么是最好的模式?除了username外,我还希望字段emailid而不必重新重写整个查询喜欢:

const query = gql`
 query user(id: String) {
  user(id: $id) {
   id
   username
   email
  }
 }
`

如果正在使事情变得更加有趣,我会在前端使用react-apollo

编辑:

只是为了澄清...类似这样的东西

const userIdFrag = gql`
  fragment UserId on User {
    id
  }
`

const fullUserFrag = gql`
  fragment FullUser on User {
    id
    username
    email
  }
`

const generateQuery = (documentNode) => {
  return gql`
   query user(id: String) {
      user(id: $id) {
       ...documentNode
      }
     }
     ${documentNode}
  `
}

const idQuery = generateQuery(userIdFrag);
const fullUserQuery = generateQuery(fullUserFrag);

(上面的方法确实有效,但是从控制台的graphql中给我错误,这使我相信这不是我应该做的事情)

2 个答案:

答案 0 :(得分:1)

根据您的评论,以下方法应该起作用:


const generateQuery = (documentNode, fragment) => {
  return gql`
   query user(id: String) {
      user(id: $id) {
       ...${fragment}
      }
     }
     ${documentNode}
  `
}

const idQuery = generateQuery(userIdFrag, 'UserId');
const fullUserQuery = generateQuery(fullUserFrag, 'FullUser');

基本上,使用的片段名称是在查询的右括号后将整个documentNode对象放在末尾时需要散布的实际片段名称。

答案 1 :(得分:0)

我不是该主题的专家,但是这是我能够找到的。 (如果您在我的假设中发现任何错误,请告诉我。)

我发现this article对于动态生成gql查询/变异有一些好处。似乎您可以通过静态方法获得一些不错的好处,尽管它的类型更多。

但是,如果您确实需要动态字段,那么我就无法使用GraphQL提供的@skip指令找到任何不好的东西。 Here the docs ref

对于在react-apollo they also have it in their docs中使用它的情况。

因此,您的代码最终可能看起来像这样:

const query = gql`
 query user($id: String, $skipUserMeta: Boolean!) {
  user(id: $id) {
   id
   username @skip(if: $skipUserMeta)
   email @skip(if: $skipUserMeta)
  }
 }
`

您只需将skipUserMeta作为变量传递到id字段旁边。

注意:我实际上找到了一段谈论the exact same approach here

的视频