获取其他相关记录(其ID与查询的ID不同)

时间:2019-10-31 15:02:16

标签: graphql apollo

作为GraphQL的新手,我希望在以下方面提供一些帮助:

我有一个查询,可以检索其作者和该作者的书。我希望作者的书籍成为作者的其他书籍,意思是-被查询的书籍除外。它涉及什么?

阿波罗角查询:

const getBookQuery = gql`
    query($id: ID){
        book(id: $id){
            id
            name
            year
            author {
                id
                firstName
                lastName
                books {        # <-- give me all _except_ the one with $id
                    name
                    year
                    id
                }
            }
        }
    }
`;

,在schema.js(node.js服务器)中,我有类似的东西:

const RootQuery = new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
        book: {
            type: BookType,
            args: { id: { type: GraphQLID } },
            resolve(parent, args) {
                const { id } = args;
                return Book.findById(id);
            },
        },
        books: {
            type: GraphQLList(BookType),
            resolve() {
                return Book.find({});
            },
        },
        // ... other queries ...
     }
})

显然,我正在寻找的解决方案应该不会破坏对books的其他查询。

1 个答案:

答案 0 :(得分:0)

您应该能够通过在Author类型def中添加一个参数,然后在用于书籍的解析器中适当使用该参数(应该将解析器嵌套在Author类型上)来实现排除。将需要调整语法以适应阿波罗角。

    type Author {
       id: 
       firstName: String
       lastName: String 
       books(exclude: ID): [Book]
     }

    const resolverMap = {
      Query: {
        book(arent, args, ctx, info) {
          ...
        }
     },
     Author: {
        books(obj, args, ctx, info) {
          // Use args.exclude passed to filter results
        },
      },
    };

   const getBookQuery = gql`
    query($id: ID){
        book(id: $id){
            id
            name
            year
            author {
                id
                firstName
                lastName
                books(exclude: $id) {        
                    name
                    year
                    id
                }
            }
        }
    }
`;