diff --git a/core/modules/jsonapi/src/IncludeResolver.php b/core/modules/jsonapi/src/IncludeResolver.php index 2aad83386f..4b4a08b737 100644 --- a/core/modules/jsonapi/src/IncludeResolver.php +++ b/core/modules/jsonapi/src/IncludeResolver.php @@ -7,6 +7,7 @@ use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem; +use Drupal\entity_reference_revisions\Plugin\Field\FieldType\EntityReferenceRevisionsItem; use Drupal\jsonapi\Access\EntityAccessChecker; use Drupal\jsonapi\Context\FieldResolver; use Drupal\jsonapi\Exception\EntityAccessDeniedHttpException; @@ -102,6 +103,7 @@ protected function resolveIncludeTree(array $include_tree, Data $data, Data $inc $includes = is_null($includes) ? new IncludedData([]) : $includes; foreach ($include_tree as $field_name => $children) { $references = []; + $isReferenceRevision = []; foreach ($data as $resource_object) { // Some objects in the collection may be LabelOnlyResourceObjects or // EntityAccessDeniedHttpException objects. @@ -141,12 +143,21 @@ protected function resolveIncludeTree(array $include_tree, Data $data, Data $inc assert(!empty($target_type)); foreach ($field_list as $field_item) { assert($field_item instanceof EntityReferenceItem); + if ($field_item instanceof EntityReferenceRevisionsItem) { + $references[$target_type][] = $field_item->get('target_revision_id')->getValue(); + $isReferenceRevision[$target_type] = $target_type; + continue; + } $references[$target_type][] = $field_item->get($field_item::mainPropertyName())->getValue(); } } foreach ($references as $target_type => $ids) { $entity_storage = $this->entityTypeManager->getStorage($target_type); - $targeted_entities = $entity_storage->loadMultiple(array_unique($ids)); + $entity_load_function = 'loadMultiple'; + if (isset($isReferenceRevision[$target_type])) { + $entity_load_function = 'loadMultipleRevisions'; + } + $targeted_entities = $entity_storage->{$entity_load_function}(array_unique($ids)); $access_checked_entities = array_map(function (EntityInterface $entity) { return $this->entityAccessChecker->getAccessCheckedResourceObject($entity); }, $targeted_entities);