微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apollo GraphQL 一次查询中的多个 ID 变量

如何解决Apollo GraphQL 一次查询中的多个 ID 变量

我想知道是否可以将多个 ID 传递给 apollo 钩子的 useQuery。或者对每个 ID 运行一个查询,如果是这样,我将如何进行。

我有以下查询

const DECOR_SHEET = gql`
  query GetDecorSheet($id: ID!) {
    findDecorSheetByID(id:$id){
      refIdArray
      sheetName
      _id
    }
  }
`;

和下面的 useQuery 钩子

const { loading,error,data: sheetData } = useQuery(DECOR_SHEET,{
    variables: { id: id },context: {
      headers: {
        authorization: cookieBearer,},});

我有以下 ID 293164663883956749,293526016787218952,我想返回一个对象以呈现到组件中。

我正在使用 Fauna DB,这是输入的 graphQL 架构

type Catalog {
  decor: Boolean
  clothing: Boolean
  supplies: Boolean
  furniture: Boolean
  owner: User
}

type Decor {
  description: String
  pieces: Int
  purchaser: String
  alterations: Boolean
  cost: Int
  purchaseDate: Date
  category: String
  image: String
  itemNum: Int
  owner: User!
  visible: Boolean
}

type DecorSheet {
  sheetName: String
  refIdArray: String
  owner: User!
}

type User {
  email: String! @unique
  catalog: Catalog
  decor: [Decor!] @relation
  decorSheet: [DecorSheet!] @relation
}

这是生成的模式

directive @embedded on OBJECT
directive @collection(name: String!) on OBJECT
directive @index(name: String!) on FIELD_DEFinitioN
directive @resolver(
  name: String
  paginated: Boolean! = false
) on FIELD_DEFinitioN
directive @relation(name: String) on FIELD_DEFinitioN
directive @unique(index: String) on FIELD_DEFinitioN
type Catalog {
  _id: ID!
  decor: Boolean
  clothing: Boolean
  supplies: Boolean
  owner: User
  furniture: Boolean
  _ts: Long!
}

input CatalogInput {
  decor: Boolean
  clothing: Boolean
  supplies: Boolean
  furniture: Boolean
  owner: CatalogownerRelation
}

input CatalogownerRelation {
  create: UserInput
  connect: ID
  disconnect: Boolean
}

scalar Date

type Decor {
  purchaseDate: Date
  visible: Boolean
  image: String
  description: String
  _id: ID!
  alterations: Boolean
  cost: Int
  pieces: Int
  category: String
  owner: User!
  purchaser: String
  itemNum: Int
  _ts: Long!
}

input DecorInput {
  description: String
  pieces: Int
  purchaser: String
  alterations: Boolean
  cost: Int
  purchaseDate: Date
  category: String
  image: String
  itemNum: Int
  owner: DecorOwnerRelation
  visible: Boolean
}

input DecorOwnerRelation {
  create: UserInput
  connect: ID
}

type DecorPage {
  data: [Decor]!
  after: String
  before: String
}

type DecorSheet {
  refIdArray: String
  _id: ID!
  sheetName: String
  owner: User!
  _ts: Long!
}

input DecorSheetInput {
  sheetName: String
  refIdArray: String
  owner: DecorSheetownerRelation
}

input DecorSheetownerRelation {
  create: UserInput
  connect: ID
}

type DecorSheetPage {
  data: [DecorSheet]!
  after: String
  before: String
}

scalar Long

type Mutation {
  updateUser(
    id: ID!
    data: UserInput!
  ): User
  createuser(data: UserInput!): User!
  createDecorSheet(data: DecorSheetInput!): DecorSheet!
  createDecor(data: DecorInput!): Decor!
  deleteCatalog(id: ID!): Catalog
  updateCatalog(
    id: ID!
    data: CatalogInput!
  ): Catalog
  updateDecor(
    id: ID!
    data: DecorInput!
  ): Decor
  updateDecorSheet(
    id: ID!
    data: DecorSheetInput!
  ): DecorSheet
  deleteDecor(id: ID!): Decor
  deleteUser(id: ID!): User
  createCatalog(data: CatalogInput!): Catalog!
  deleteDecorSheet(id: ID!): DecorSheet
}

type Query {
  findUserByID(id: ID!): User
  findCatalogByID(id: ID!): Catalog
  findDecorByID(id: ID!): Decor
  findDecorSheetByID(id: ID!): DecorSheet
}

scalar Time

type User {
  catalog: Catalog
  email: String!
  _id: ID!
  decor(
    _size: Int
    _cursor: String
  ): DecorPage!
  decorSheet(
    _size: Int
    _cursor: String
  ): DecorSheetPage!
  _ts: Long!
}

input UserCatalogrelation {
  create: CatalogInput
  connect: ID
  disconnect: Boolean
}

input UserDecorRelation {
  create: [DecorInput]
  connect: [ID]
  disconnect: [ID]
}

input UserDecorSheetRelation {
  create: [DecorSheetInput]
  connect: [ID]
  disconnect: [ID]
}

input UserInput {
  email: String!
  catalog: UserCatalogrelation
  decor: UserDecorRelation
  decorSheet: UserDecorSheetRelation
}

一个选项可以使用 Fauna 的 FQL 进行查询,它可能有一种查询多个 ID 的方法,我将不得不研究它,但如果可能的话,我更愿意在带有 apollo 的 graphQL 中执行此操作。

提前致谢

解决方法

感谢 FaunaDB 的支持

以下查询和 UDF 起到了作用

查询

type Query {
  getMultipleDecors(DecorId: [ID!]): [Decor]
    @resolver(name: "get_multiple_decors")
}

udf 名为 get_multiple_decors

Query(
  Lambda(
    ["input"],Let(
      {
        data: Map(
          Var("input"),Lambda("x",Get(Ref(Collection("Decor"),Var("x"))))
        )
      },Var("data")
    )
  )
)
,

如果总是正好有两个 id,您可以使用字段别名轻松地在单个查询中获取两个对象:

const DECOR_SHEET = gql`
  query GetDecorSheet($firstId: ID!,$secondId: ID!) {
    firstDecorSheet: findDecorSheetByID(id: $firstId) {
      refIdArray
      sheetName
      _id
    }
    secondDecorSheet: findDecorSheetByID(id: $secondId) {
      refIdArray
      sheetName
      _id
    }
  }
`;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。