Laurence
Laurence

Reputation: 377

How to perform a nested query in graphql using gatsby-source-prismic

I'm just getting started with gatsby and graphql and I've started using prismic as a cms. I cannot figure out how to perform nested queries, avoiding overfetching. I don't even know if it would be possible or if it's more just me thinking of the problem in SQL terms.

I have two custom types on prismic which are related using a content relationship. These are Productions which have many People through a repeatable group of fields. The result I want is to have a page (the home) which shows the latest production with the list of people who starred in it, and another page with each person from people and all their roles in every production.

I managed to do this by fetching all the people in the home page and the required production and filtering the returned data in the frontend via javascript. However, I really feel that this way is not ideal since it requires to fetch all the people and not only the ones required for my page.

    allPrismicProduction(
      limit: 1
      sort: { fields: [last_publication_date], order: DESC }
    )  {
    edges {
      node {
        data {
          casting {
            ...castingData
          }
        }
      }
    }
  }
    allPrismicPerson {
      edges {
        node {
          id
          data {
            name {
              text
            }
            photo {
              url
            }
          }
        }
      }
    }
  }

const productions = data.allPrismicProduction.edges
const people = data.allPrismicPerson.edges
const sortedprods = []
productions.forEach(el => {
    let castings = el.node.data.casting.map(cast => cast.person.uid)
    castings.forEach(casting =>{
    people.filter(person => {
      if(castings.indexOf(person.node.uid) > -1){
        return person
      }
    sortedprods.push({
      production: el.node,
      people: relpeople,
    })
  })
})

So what I do is I fetch all people and then filter them according to the uids found in the productions returned by the query.

I would like to know if it is possible, or otherwise what would be a better way to achieve this, how to limit overfetching by making it possible to only fetch the people who's uid is present in the productions given by the first part of the query. Is this way of thinking compatible with graphql?

Upvotes: 2

Views: 1322

Answers (1)

Laurence
Laurence

Reputation: 377

I managed to solve this by looking around a bit more in the other issues of gatsby-source-prismic on github. The related-content node can be queried using the following structure:

{
  allPrismicMyContentType {
    edges {
      node {
        data {
          my_relations {
            relation {
              document {
                data {

where in data you can access all the properties of the type needed.

In this way one can do a single query to get all related content on prismic

Upvotes: 1

Related Questions