Mark Llobrera

GraphQL, Aliases, and Multiple Image Derivatives

As part of Bluecadet’s Drupal 8-as-data-API setup we often need to deliver multiple derivatives of an image to products. So the first step was figuring out how to get output for an image field within a Media bundle. That looks something like this:

query{
nodeQuery(limit: 100, filter: {conditions: [{field: "type", value: "hotspot", operator: EQUAL}]}) {
entities {
entityLabel
... on NodeHotspot {
fieldName,
title,
fieldThumbnailImage {
entity {
... on MediaImage {
fieldMediaImage {
url
width
height
alt
title
}
}
}
},
}
}
}
}

Where we have to grab the field which contains a Media bundle of type Image (MediaImage), and get the actual image field within that bundle (fieldMediaImage). This results in the output for the url, width, height, alt, and title fields at the original upload size. Which is fine, but what if you want an image derivative, say the thumbnail image style?

query{
nodeQuery(limit: 100, filter: {conditions: [{field: "type", value: "hotspot", operator: EQUAL}]}) {
entities {
entityLabel
... on NodeHotspot {
fieldName,
title,
fieldThumbnailImage {
entity {
... on MediaImage {
fieldMediaImage {
derivative(style: THUMBNAIL) {
url
width
height
}
url
width
height
alt
title
}
}
}
},
}
}
}
}

In this case we’ve added a derivative filter (I think that’s the right term) for the image style THUMBNAIL (all-caps seems to be required by the GraphiQL interface included with the Drupal 8 GraphQL module). Within that filter we’re getting the url, width, and height (I’ve left the fields for the original source size outside the derivative block).

What about two (or more) derivatives? Enter query aliases (see this helpful post for more).

query{
nodeQuery(limit: 100, filter: {conditions: [{field: "type", value: "hotspot", operator: EQUAL}]}) {
entities {
entityLabel
... on NodeHotspot {
fieldName,
title,
fieldThumbnailImage {
entity {
... on MediaImage {
fieldMediaImage {
thumbnail:derivative(style: THUMBNAIL) {
url
width
height
}
large:derivative(style: LARGE) {
url
width
height
}
url
width
height
alt
title
}
}
}
},
}
}
}
}

In this block we’re aliasing two queries for image style derivatives to thumbnail and large, respectively: (thumbnail:derivative(… and large:derivative(…). In fact, you can alias anything. So if you don’t want your output to say entity, you could just stick an alias in front, like image_sizes:entity.