only in patch2: unchanged: --- a/core/modules/jsonapi/tests/src/Functional/ResourceTestBase.php +++ b/core/modules/jsonapi/tests/src/Functional/ResourceTestBase.php @@ -1754,13 +1754,67 @@ protected function getExpectedGetRelationshipDocumentData($relationship_field_na } if (!$is_multiple) { $target_entity = $field->entity; - return is_null($target_entity) ? NULL : static::toResourceIdentifier($target_entity); + if (is_null($target_entity)) { + return NULL; + } + else { + $resource_identifier = static::toResourceIdentifier($target_entity); + $fieldStorageDefinition = $field->getFieldDefinition() + ->getFieldStorageDefinition(); + $property_definition = $fieldStorageDefinition->getPropertyDefinition('target_id'); + $is_data_reference_definition = $property_definition instanceof DataReferenceTargetDefinition; + if($is_data_reference_definition){ + $resource_identifier['meta']['drupal_internal__target_id'] = is_numeric($field->target_id) ? (int) $field->target_id : $field->target_id; + } + return $resource_identifier; + } } else { - return array_filter(array_map(function ($item) { + $arity_counter = []; + $relation_list = array_filter(array_map(function ($item) use (&$arity_counter) { + /** @var \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem $item */ $target_entity = $item->entity; - return is_null($target_entity) ? NULL : static::toResourceIdentifier($target_entity); + + if (is_null($target_entity)) { + return NULL; + } + else { + $resource_identifier = static::toResourceIdentifier($target_entity); + + if(!isset($arity_counter[$resource_identifier['type']])){ + $arity_counter[$resource_identifier['type']] = []; + if(!isset($arity_counter[$resource_identifier['type']][$resource_identifier['id']])){ + $arity_counter[$resource_identifier['type']][$resource_identifier['id']] = 0; + } + } + $arity_counter[$resource_identifier['type']][$resource_identifier['id']]++; + + $fieldStorageDefinition = $item->getFieldDefinition() + ->getFieldStorageDefinition(); + $property_definition = $fieldStorageDefinition->getPropertyDefinition('target_id'); + $is_data_reference_definition = $property_definition instanceof DataReferenceTargetDefinition; + if ($is_data_reference_definition) { + $resource_identifier['meta']['drupal_internal__target_id'] = is_numeric($item->target_id) ? (int) $item->target_id : $item->target_id; + } + return $resource_identifier; + } }, iterator_to_array($field))); + + $arity_map = []; + $relation_list = array_map(function ($identifier) use ($arity_counter, &$arity_map) { + if(isset($arity_counter[$identifier['type']]) && isset($arity_counter[$identifier['type']][$identifier['id']]) && $arity_counter[$identifier['type']][$identifier['id']] > 1){ + if(!isset($arity_map[$identifier['type']])){ + $arity_map[$identifier['type']] = []; + if(!isset($arity_map[$identifier['type']][$identifier['id']])){ + $arity_map[$identifier['type']][$identifier['id']] = 0; + } + } + $identifier['meta']['arity'] = $arity_map[$identifier['type']][$identifier['id']]++; + } + return $identifier; + }, $relation_list); + + return $relation_list; } }