关联查询时日常业务中是经常用到的,graphql
中的关联查询配置比较简单,这里对 graphql
的关联查询配置进行讲解说明。
图中 Author Schema
,Post Schema
与 Query
部分
定义 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
的数据结构,后续还定义了依据 id
对 Author
与 Post
的查询。
需要注意的是在 Author
的数据结构中的 posts
字段与 Post
的数据结构中的 author
字段,这两个字段关联了其他的数据结构。
图中 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)
}
};
由于 Author
与 Post
中有关联字段 posts
与 author
,在 resolvers
中需要定义这两个字段的内容的获取规则:
Author
的posts
字段内容获取规则为:“获取 posts 中 authorId 与查询到的 authorId 相同的 post”Post
中author
字段内容获取规则为:“获取 authors 中 id 与该 post 的 authorId 字段相等的 author”
schema 的构建方法和 1.graphql基础查询
中介绍的方法相同,这里不再赘述
// 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 目录