public function serializeEmbeddedDocument($embeddedValue, $embeddedFieldMapping, $embedMany = false)
{
if ($embeddedValue === null) {
return null;
}
if (!$embedMany && 'many' == $embeddedFieldMapping['embedded'] && (is_array($embeddedValue) || $embeddedValue instanceof \Traversable)) {
$data = array();
foreach ($embeddedValue as $key => $val) {
$data[$key] = $this->serializeEmbeddedDocument($val, $embeddedFieldMapping, true);
}
} else {
$embeddedClass = null;
if (isset($embeddedFieldMapping['targetDocument'])) {
$embeddedClass = $this->metadataFactory->getMetadataFor(ClassUtils::getClass($embeddedValue));
if ($embeddedClass->name !== $embeddedFieldMapping['targetDocument'] && !is_subclass_of($embeddedClass->name, $embeddedFieldMapping['targetDocument'])) {
throw new \InvalidArgumentException('Mismatching metadata description in the EmbeddedDocument, expected class ' . $embeddedFieldMapping['targetDocument'] . ' but got ' . get_class($embeddedValue));
}
} else {
$embeddedClass = $this->metadataFactory->getMetadataFor(get_class($embeddedValue));
}
$data = $this->metadataResolver->createDefaultDocumentStruct($embeddedClass);
foreach ($embeddedClass->reflFields as $fieldName => $reflProperty) {
$value = $reflProperty->getValue($embeddedValue);
$fieldMapping = $embeddedClass->fieldMappings[$fieldName];
if ($value === null) {
continue;
} else {
if (isset($fieldMapping['embedded'])) {
$data[$fieldMapping['jsonName']] = $this->serializeEmbeddedDocument($value, $fieldMapping);
} else {
$data[$fieldMapping['jsonName']] = Type::getType($fieldMapping['type'])->convertToCouchDBValue($value);
}
}
}
}
return $data;
}