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

Apollo GraphQL multiple ID variables in one query

我想知道是否可以将多个 ID 传递给 useQuery for apollo hook。或者 运行 每个 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,我想 return 到一个对象中以便呈现到一个组件中。

我正在使用 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 的方法,我将不得不研究它,但如果可能的话,我更愿意在 graphQL 中使用 apollo 来执行此操作。

提前致谢

如果总是恰好有两个 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
    }
  }
`;

感谢 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")
    )
  )
)