1
0
mirror of synced 2025-03-26 09:53:54 +03:00

DDC-1278 - EntityManager::clear($entity) support

cascade detach operation only on entity name entities
This commit is contained in:
Dominik Liebler 2011-08-13 20:22:23 +02:00
parent 745535d269
commit 25f5ff0ca1

View File

@ -1515,8 +1515,9 @@ class UnitOfWork implements PropertyChangedListener
* *
* @param object $entity * @param object $entity
* @param array $visited * @param array $visited
* @param string $entityName detach only entities of this type when given
*/ */
private function doDetach($entity, array &$visited) private function doDetach($entity, array &$visited, $entityName = null)
{ {
$oid = spl_object_hash($entity); $oid = spl_object_hash($entity);
if (isset($visited[$oid])) { if (isset($visited[$oid])) {
@ -1539,7 +1540,7 @@ class UnitOfWork implements PropertyChangedListener
return; return;
} }
$this->cascadeDetach($entity, $visited); $this->cascadeDetach($entity, $visited, $entityName);
} }
/** /**
@ -1617,8 +1618,9 @@ class UnitOfWork implements PropertyChangedListener
* *
* @param object $entity * @param object $entity
* @param array $visited * @param array $visited
* @param string $entityName detach only entities of this type when given
*/ */
private function cascadeDetach($entity, array &$visited) private function cascadeDetach($entity, array &$visited, $entityName = null)
{ {
$class = $this->em->getClassMetadata(get_class($entity)); $class = $this->em->getClassMetadata(get_class($entity));
foreach ($class->associationMappings as $assoc) { foreach ($class->associationMappings as $assoc) {
@ -1632,10 +1634,14 @@ class UnitOfWork implements PropertyChangedListener
$relatedEntities = $relatedEntities->unwrap(); $relatedEntities = $relatedEntities->unwrap();
} }
foreach ($relatedEntities as $relatedEntity) { foreach ($relatedEntities as $relatedEntity) {
$this->doDetach($relatedEntity, $visited); if ($entityName === null || get_class($relatedEntity) == $entityName) {
$this->doDetach($relatedEntity, $visited, $entityName);
}
} }
} else if ($relatedEntities !== null) { } else if ($relatedEntities !== null) {
$this->doDetach($relatedEntities, $visited); if ($entityName === null || get_class($relatedEntities) == $entityName) {
$this->doDetach($relatedEntities, $visited, $entityName);
}
} }
} }
} }
@ -1812,20 +1818,20 @@ class UnitOfWork implements PropertyChangedListener
if ($this->commitOrderCalculator !== null) { if ($this->commitOrderCalculator !== null) {
$this->commitOrderCalculator->clear(); $this->commitOrderCalculator->clear();
} }
if ($this->evm->hasListeners(Events::onClear)) {
$this->evm->dispatchEvent(Events::onClear, new Event\OnClearEventArgs($this->em));
}
} else { } else {
$visited = array(); $visited = array();
foreach ($this->identityMap as $className => $entities) { foreach ($this->identityMap as $className => $entities) {
if ($className === $entityName) { if ($className === $entityName) {
foreach ($entities as $entity) { foreach ($entities as $entity) {
$this->doDetach($entity, $visited); $this->doDetach($entity, $visited, $entityName);
} }
} }
} }
} }
if ($this->evm->hasListeners(Events::onClear)) {
$this->evm->dispatchEvent(Events::onClear, new Event\OnClearEventArgs($this->em));
}
} }
/** /**