Skip to content

Latest commit

 

History

History
144 lines (125 loc) · 3.56 KB

2.graphql关联查询.md

File metadata and controls

144 lines (125 loc) · 3.56 KB

graphql 关联查询

关联查询时日常业务中是经常用到的,graphql 中的关联查询配置比较简单,这里对 graphql 的关联查询配置进行讲解说明。

整体结构一览

docs/base2.png

数据结构与查询结构的定义

图中 Author SchemaPost SchemaQuery 部分

定义 Author 的数据结构并针对该结构定义相应的查询:

# path: scripts/base2/schema.graphql

# Author 表
type Author {
    id: Int!
    nickname: String
    posts: [Post]       # 关联 POST 表,且为数组
}

# Post 表
type Post {
    id: Int!
    title: String
    author: Author      # 关联 Author 表
}

# 查询表
type Query {
    author(id: Int!): Author
    post(id: Int!): Post
}

这里定义了 Author, Post 的数据结构,后续还定义了依据 idAuthorPost 的查询。
需要注意的是在 Author 的数据结构中的 posts 字段与 Post 的数据结构中的 author 字段,这两个字段关联了其他的数据结构。

resolvers

图中 resolvers 部分

数据源:

// path: scripts/base2/base2.js

const authors = [
    { id: 1, nickname: 'aaa' },
    { id: 2, nickname: 'bbb' },
    { id: 3, nickname: 'ccc' }
];

const posts = [
    { id: 1, authorId: 1, title: 'p111' },
    { id: 2, authorId: 2, title: 'p222' },
    { id: 3, authorId: 2, title: 'p333' },
    { id: 4, authorId: 3, title: 'p444' }
];

resolvers 部分:

// path: scripts/base2/base2.js

const resolvers = {
    Author: {
        // Author 中关联字段部分的解析获取定义
        posts: (author) => _.filter(posts, { authorId: author.id })
    },
    Post: {
        // Post 中关联字段部分的解析定义
        author: (post) => _.find(authors, { id: post.authorId })
    },
    Query: {
        author: (blannk, select) => _.find(authors, select),
        post: (blank, select) => _.find(posts, select)
    }
};

由于 AuthorPost 中有关联字段 postsauthor,在 resolvers 中需要定义这两个字段的内容的获取规则:

  1. Authorposts 字段内容获取规则为:“获取 posts 中 authorId 与查询到的 authorId 相同的 post”
  2. Postauthor 字段内容获取规则为:“获取 authors 中 id 与该 post 的 authorId 字段相等的 author”

构建相应的 schema 对象

schema 的构建方法和 1.graphql基础查询 中介绍的方法相同,这里不再赘述

使用 schema 对象进行查询操作

// path: scripts/base2/base2.js

// 通过 id 查询 author
const queryAuthor = `
    query {
        author(id: 2) {
            nickname
            posts {
                title
            }
        }
    }
`;
graphql(schema, queryAuthor).then((result) => {
    // result = {
    //   "data": {
    //     "author": {
    //       "nickname": "bbb",
    //       "posts": [
    //         {
    //           "title": "p222"
    //         },
    //         {
    //           "title": "p333"
    //         }
    //       ]
    //     }
    //   }
    // }
});

// 通过 id 查询 post
const queryPost = `
    query {
        post(id: 4) {
            title
            author {
                nickname
            }
        }
    }
`;
graphql(schema, queryPost).then((result) => {
    // result = {
    //   "data": {
    //     "post": {
    //       "title": "p444",
    //       "author": {
    //         "nickname": "ccc"
    //       }
    //     }
    //   }
    // }
});

详细代码可以参考 /scripts/base2 目录