具有多个别名和 Apollo (Vue.js) 的 GraphQL 查询

Posted

技术标签:

【中文标题】具有多个别名和 Apollo (Vue.js) 的 GraphQL 查询【英文标题】:GraphQL queries with multiple aliases and Apollo (Vue.js) 【发布时间】:2020-10-18 16:17:07 【问题描述】:

我正在尝试使用 Apollo 从我的 Strapi 后端的单一集合类型中获取数据到 Vue.js 项目中。它适用于单个别名,但我无法使其适用于多个别名。

我从“活动”的集合类型中获取数据,该集合类型具有“存档”布尔字段。我想创建一个“活动”数组,其中包含所有尚未归档的活动(归档 = false)以及包含所有归档活动的“归档”数组(归档 = true)。

这是我的代码:

import gql from "graphql-tag";

export default 
  name: "Campaigns",
  data() 
    return 
      campaigns: [],
      archive: []
    ;
  ,
  apollo: 
    campaigns: gql`
      query getCampaigns 
        campaigns: campaigns(where:  archive: "false" , sort: "order:DESC") 
          name
          url
        
        archive: campaigns(where:  archive: "true" , sort: "order:DESC") 
          name
          url
        
      
    `
  

查询返回“campaigns”数组,但“archive”数组仍为空。

我尝试过切换(首先放置存档别名,切换布尔值以确保我通常可以访问存档活动的数据等)。问题显然在于“存档”别名。

当我对 Strapi 的 GraphQL 游乐场使用相同的查询时,我得到了想要的结果:


  campaigns: campaigns(where:  archive: "false" , sort: "order:DESC") 
    name
  
  archive: campaigns(where:  archive: "true" , sort: "order:DESC") 
    name
  

...返回...


  "data": 
    "campaigns": [
      
        "name": "2020"
      ,
      
        "name": "2019"
      ,
      
        "name": "2018"
      ,
      
        "name": "2017"
      
    ],
    "archive": [
      
        "name": "2016"
      ,
      
        "name": "2015"
      
    ]
  

如何使用 Apollo 在 Vue.js 中进行查询?

【问题讨论】:

【参考方案1】:

我认为最好的方法是使用update 属性:https://apollo.vuejs.org/guide/apollo/queries.html#name-matching

apollo: 
    campaigns: 
      query: gql`
        query 
          campaigns: campaigns(
            where:  archive: "false" 
            sort: "order:desc"
          ) 
            name
            url
          
        
      `
    ,
    archive: 
      update: data => data.campaigns,
      query: gql`
        query 
          campaigns(where:  archive: "true" , sort: "order:desc") 
            name
            url
          
        
      `
    
  

【讨论】:

【参考方案2】:

我想我找到了解决办法。从技术上讲,我猜这些是单独的查询(如果我是正确的,这会破坏别名的目的)但它可以满足我的需求:

  apollo: 
    campaigns: 
      query: gql`
        query 
          campaigns: campaigns(
            where:  archive: "false" 
            sort: "order:desc"
          ) 
            name
            url
          
        
      `
    ,
    archive: 
      query: gql`
        query 
          archive: campaigns(where:  archive: "true" , sort: "order:desc") 
            name
            url
          
        
      `
    
  

显然在某些情况下初始化“apollo: XYZ:”和别名“query XYZ:”必须匹配。我在文档中看到它们不一定必须匹配,但我不完全理解何时以及为什么。

我想我无法真正说出初始参数的作用。

【讨论】:

【参考方案3】:

您使用campaigns 作为整个查询的键,因此您需要像这样初始化数据:

data() 
  return 
    campaigns: 
      campaigns: [],
      archive: [],
    ,
  ;
,

然后您可以通过密钥访问每个列表(即campaigns.campaignscampaigns.archive)。

【讨论】:

谢谢!你确定吗?当我像这样初始化数据时,我仍然无法访问campaigns.campaignscampaigns.archive。我仍然可以像以前一样访问campaigns,而archive 是空的。此外,当我使用 devtools 检查 Vue 树时,我看到的只是……“$apolloData >campaigns: Array[4] > 4 Objects contains 2017-2020” 与下面的数据相同。 射击。抱歉,距离我上次使用 Vue 已经有一段时间了。我 think 对于多个查询,您可能必须使用 result 选项自己手动设置数据,在这种情况下,您仍然可以像原来一样将其初始化为 campaigns: [], archive: [] 嗯,语法真的让我很困惑。我注意到某些术语必须匹配才能使查询正常工作,但我不确定为什么。我似乎无法理解嵌套以及与查询结构中的内容相对应的内容。我还想知道语法是否在某个时候发生了变化,因为我一直在阅读引用的文档已经过时,并且我尝试了教程中的内容,但它不起作用。当我使用结果或更新时,数据属性显然是未定义的。

以上是关于具有多个别名和 Apollo (Vue.js) 的 GraphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Vue.JS 中的 Apollo Graphql 查询错误?

具有多个 GraphQL 端点的 Apollo

text Apollo GraphQL Vue.js错误结果缺少属性

无法读取未定义的属性“findOne” - Vue.js、Apollo Server、GraphQL 错误

使用 Vue js 发布具有多个组件的表单的最佳方式是啥

Apache 2.4 具有不同别名和路径的多个站点