Jghorton14
Jghorton14

Reputation: 754

Entity Association syntax issue with graphql queries

I am trying to understand graphql's query and mutation syntax. Given this example:

type Author {
  id: Int!
  firstName: String
  lastName: String
  posts: [Post]
}

type Post {
  id: Int!
  title: String
  author: Author
  votes: Int
}

type Query {
  posts: [Post]
  author(id: Int!): Author
} 

What should the queries look like to associate a post with the author? Is this where connections come into play or is that something else? Here is my attempt at trying to solve the problem but to avail.

mutation createAuthor {
  createAuthor(input: {
    id: 123
    firstName: "Bob"
    lastName: "Smith"
  }) {
    id
    firstName
    lastName
  }
}

query listAuthors {
  listAuthors {
    items {
      id
      firstName
      lastName
    }
  }
}

mutation createPost {
  createPost(input: {
    id: 12345
    title: "Title"
    votes: 345
    author: {
      lastName: {
        contains: "Bob"
      }
    }
  }) {
    id
    title
    votes
    author {
      id
      firstName
      lastName
    }
  }
}

Any help on this would be appreciated. My Goal is to Query an author and return all of the post's associated with that author as well as create a Post Mutation that adds a post to an author.

Upvotes: 0

Views: 52

Answers (1)

Tinou
Tinou

Reputation: 6158

There are 2 questions in one, so I'll answer in the order there were asked.

1. return all of the posts associated with an author

Your schema looks correct. The query would look like:

query {
  author(id: 1) {
    id
    posts {
      id 
      title
    }
  }
}

2. create Post and attach to an author

In your example if you want to expose an interface to create a Post, then you would have to expose a mutation field in your schema

e.g:

type Mutation {
  createPost(input: CreatePostInput): Post
}

if you want at the same time of creating a post, to also attach it to an author then you could add the authorId as part of the input, here we only want to attach the Post to an existing Author:

input CreatePostInput {
  title: String
  authorId: ID!
  votes: Int
}

of course this is only the interface definition. We need to actually create the Post and link it to the Author inside the resolver.

The mutation query will look like:

mutation createPost {
  createPost(input: {
    title: "Title"
    votes: 345
    authorId: "authorId1" 
  }) {
    id
    title
    votes
    author {
      id
      firstName
      lastName
    }
  }
}

Hope that helps!

Upvotes: 1

Related Questions