private function cascadePersist($document, array &$visited)
{
$class = $this->dm->getClassMetadata(get_class($document));
$associationMappings = array_filter($class->associationMappings, function ($assoc) {
return $assoc['isCascadePersist'];
});
foreach ($associationMappings as $fieldName => $mapping) {
$relatedDocuments = $class->reflFields[$fieldName]->getValue($document);
if ($relatedDocuments instanceof Collection || is_array($relatedDocuments)) {
if ($relatedDocuments instanceof PersistentCollectionInterface) {
if ($relatedDocuments->getOwner() !== $document) {
$relatedDocuments = $this->fixPersistentCollectionOwnership($relatedDocuments, $document, $class, $mapping['fieldName']);
}
// Unwrap so that foreach() does not initialize
$relatedDocuments = $relatedDocuments->unwrap();
}
$count = 0;
foreach ($relatedDocuments as $relatedKey => $relatedDocument) {
if (!empty($mapping['embedded'])) {
list(, $knownParent, ) = $this->getParentAssociation($relatedDocument);
if ($knownParent && $knownParent !== $document) {
$relatedDocument = clone $relatedDocument;
$relatedDocuments[$relatedKey] = $relatedDocument;
}
$pathKey = CollectionHelper::isList($mapping['strategy']) ? $count++ : $relatedKey;
$this->setParentAssociation($relatedDocument, $mapping, $document, $mapping['fieldName'] . '.' . $pathKey);
}
$this->doPersist($relatedDocument, $visited);
}
} elseif ($relatedDocuments !== null) {
if (!empty($mapping['embedded'])) {
list(, $knownParent, ) = $this->getParentAssociation($relatedDocuments);
if ($knownParent && $knownParent !== $document) {
$relatedDocuments = clone $relatedDocuments;
$class->setFieldValue($document, $mapping['fieldName'], $relatedDocuments);
}
$this->setParentAssociation($relatedDocuments, $mapping, $document, $mapping['fieldName']);
}
$this->doPersist($relatedDocuments, $visited);
}
}
}