diff --git a/core/modules/jsonapi/src/IncludeResolver.php b/core/modules/jsonapi/src/IncludeResolver.php index af68b68521..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,22 +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); - $field_item_properties = $field_item->getProperties(); if ($field_item instanceof EntityReferenceRevisionsItem) { - // Load the revision id. - $references[$target_type]['revision_id'][] = $field_item->get('target_revision_id')->getValue(); - } - else { - $references[$target_type]['id'][] = $field_item->get($field_item::mainPropertyName())->getValue(); + $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_and_rev => $ids) { - list($target_type, $revision_type) = explode(':', $target_type_and_rev); + foreach ($references as $target_type => $ids) { $entity_storage = $this->entityTypeManager->getStorage($target_type); - $targeted_entities = ($revision_type === 'revision_ids') - ? $entity_storage->loadMultipleRevisions($ids) - : $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);