问题描述
我想知道是否可以将多个 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
}
}
`;