Typically our database is designed with some relationships. When retrieving data from our GraphQL, we would want them to present in a relationship hierarchy as well.
In this tutorial, we will learn how to build nested queries using Youshido/GraphQL.
In our blog example, there is a series of articles and each article belongs to an author. When retrieving articles' data, it makes more sense to fetch belonging author's data as well instead of "author_id".
Table Of Content
1. Add AuthorType.php
Apparently, we need AuthorType in order to resolve the type.
As we can see, it is a super simple type with an id(integer) and name(string) fields.
2. Add AuthorField.php
We will use AuthorField to resolve the request.
Let's take a close look at the resolve method.
When getting the $authorId, we fetch it directly from the $value variable as shown below:
This is because $value is configured to contain values from the parent. Which is article is our case. And because we know article will return an author_id, we fetch it directly from $value variable.
The rest of the code is self-explanatory, we find the author that article belongs to using our fake repository and return it.
3. Modify ArticleField.php
We are almost done. The last piece is to modify ArticleField.php to wire ArticleType and AuthorType up.
To do this, open src/Type/ArticleType.php. And change
Our final src/Type/ArticleType.php file looks like this after the modification:
In the first tutorial, we are getting articles data using a query similar to:
Now we can get full author data using:
The magic here is that, if you do not ask for author's data. The resolve method(AuthorField::resolve) will never be called. The Youshido/GraphQL library takes care of the job of figuring out which resolve methods to call.
4. The End
Hopefully this simple tutorial helped you with your development.
If you like our post, please follow us on Twitter and help spread the word. We need your support to continue.
If you have questions or find our mistakes in above tutorial, do leave a comment below to let us know.