public function doCascadeRemovePersistentCollections($document, array &$visited)
{
$oid = spl_object_hash($document);
if (isset($visited[$oid])) {
return;
// Prevent infinite recursion
}
$visited[$oid] = $document;
// mark visited
$class = $this->dm->getClassMetadata(get_class($document));
$associationMappings = $class->associationMappings;
foreach ($associationMappings as $assoc) {
$relatedDocuments = $class->reflFields[$assoc['fieldName']]->getValue($document);
if ($relatedDocuments instanceof PersistentCollection) {
$relatedDocuments = $relatedDocuments->getValues();
}
if (is_array($relatedDocuments)) {
$class->reflFields[$assoc['fieldName']]->setValue($document, $relatedDocuments);
foreach ($relatedDocuments as $relatedDocument) {
$this->doCascadeRemovePersistentCollections($relatedDocument, $visited);
}
} elseif (is_object($relatedDocuments)) {
$this->doCascadeRemovePersistentCollections($relatedDocuments, $visited);
}
}
}