GraphQL Понимание отношений и вложенных мутаций - PullRequest
0 голосов
/ 11 февраля 2020

При отправке новых данных коллекция автоматически генерирует новый идентификатор, но что произойдет, если вы попытаетесь отправить две отдельные коллекции одновременно? Так как они становятся связаны друг с другом? Я думал, если это возможно (данные посты и теги являются отдельными коллекциями):

mutation AddPostsAndTags(
  $title:String!, 
  $description:String!, 
  $tags: [String]!
){
  addPosts(
    title:$title, 
    description: $description, 
    tags: $tags
  ){
    id
    title
    description
    tags {
      id
      name
    }
  }
}

Предполагая, что теги относятся к постам, я должен делать это так? Когда я запускаю его на основе этого запроса:

{
  "title": "hello",
  "description": "more d123escription",
  "tags": ["info", "help"]
}

Я получаю:

{
  "data": {
    "addPost": null
  }
}

Данные поста добавляются в коллекцию постов, но ничего в тегах.

Вот мои типы сообщений и тегов:

Тип сообщения:

const PostType = new GraphQLObjectType({
  name: 'PostType',
  fields: () => ({
    id: { type: GraphQLID },
    title: { type: GraphQLString },
    description: { type: GraphQLString },
    tags: {
      type: new GraphQLList(TagType),
      resolve(parentValue, args) {
        return axios
          .get(`http://localhost:3000/posts/${parentValue.id}/posts`)
          .then(resp => resp.data);
      }
    }
  })
});

Тип тега:

const TagType = new GraphQLObjectType({
  name: 'TagType',
  fields: () => ({
    id: {type: GraphQLID},
    name: {type: GraphQLString},
    post: {
      type: require('./PostType'),
      resolve(parentValue, args) {
        return axios.get(`http://localhost:3000/posts/${parentValue.postId}`).then(resp => resp.data);
      },
    },
  }),
});

Разделение этих различных типов, но они связаны на основе идентификатора.

Тогда у меня есть мутация:

const Mutations = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    addPost: {
      type: PostType,
      args: {
        title: {type: new GraphQLNonNull(GraphQLString)},
        description: {type: new GraphQLNonNull(GraphQLString)},

        // is this posts necessary? It is a GraphQLList

        posts: {type: new GraphQLNonNull(new GraphQLList(GraphQLString))},
      },
      resolve(parentValue, {title, description}) {
        return axios
          .post(`http://localhost:3000/posts`, {title, description})
          .then(res => console.log(res));
      },
    },
    addTag: {
      type: TagType,
      args: {
        name: {type: new GraphQLNonNull(GraphQLString)},
        description: {type: GraphQLString},
        postId: {type: GraphQLString},
      },
      resolve(parentValue, {name}) {
        return axios
          .post(`http://localhost:3000/tags`, {name})
          .then(res => res.data);
      },
    },

    // Should I have another mutation? like AddTagsToPosts? Is this the best approach?
  },
});

Теперь я даже не уверен, правильно ли настроена моя мутация. Нужен ли пост GraphQLList в AddPost? Должен ли я иметь одну простую мутацию, чтобы иметь и сообщения, и теги?

...