/** * @param array|mixed $id * * @return array * @throws MappingException */ protected function fixScalarId($id, ApiMetadata $metadata) { if (is_array($id)) { return $id; } $id = (array) $id; $identifiers = $metadata->getIdentifierFieldNames(); if (count($id) !== count($identifiers)) { throw MappingException::invalidIdentifierStructure(); } return array_combine($identifiers, (array) $id); }
/** * convert foreign identifiers into scalar foreign key values to avoid object to string conversion failures. * * @param ApiMetadata $class * @param array $id * * @return array */ public function flattenIdentifier(ApiMetadata $class, array $id) { $flatId = []; foreach ($class->getIdentifierFieldNames() as $field) { if ($class->hasAssociation($field) && array_key_exists($field, $id) && is_object($id[$field])) { /* @var EntityMetadata $targetClassMetadata */ $targetClassMetadata = $this->manager->getClassMetadata($class->getAssociationMapping($field)['target']); if ($this->unitOfWork->isInIdentityMap($id[$field])) { $associatedId = $this->flattenIdentifier($targetClassMetadata, $this->unitOfWork->getEntityIdentifier($id[$field])); } else { $associatedId = $this->flattenIdentifier($targetClassMetadata, $targetClassMetadata->getIdentifierValues($id[$field])); } $flatId[$field] = implode(' ', $associatedId); } else { $flatId[$field] = $id[$field]; } } return $flatId; }