/** @inheritdoc */
public function remove($entity, $recursive = FALSE)
{
$entity = $entity instanceof IEntity ? $entity : $this->getById($entity);
$this->identityMap->check($entity);
if (isset($this->isProcessing[spl_object_hash($entity)])) {
return $entity;
}
$this->isProcessing[spl_object_hash($entity)] = TRUE;
$this->fireEvent($entity, 'onBeforeRemove');
foreach ($entity->getMetadata()->getProperties() as $property) {
if ($property->relationship !== NULL) {
if (in_array($property->relationship->type, [PropertyRelationshipMetadata::MANY_HAS_ONE, PropertyRelationshipMetadata::ONE_HAS_ONE, PropertyRelationshipMetadata::ONE_HAS_ONE_DIRECTED])) {
$entity->getProperty($property->name)->set(NULL, TRUE);
} elseif ($property->relationship->type === PropertyRelationshipMetadata::MANY_HAS_MANY) {
$entity->getValue($property->name)->set([]);
} else {
$reverseRepository = $this->model->getRepository($property->relationship->repository);
$reverseProperty = $reverseRepository->getEntityMetadata()->getProperty($property->relationship->property);
if ($reverseProperty->isNullable || !$recursive) {
$entity->getValue($property->name)->set([]);
} else {
foreach ($entity->getValue($property->name) as $reverseEntity) {
$reverseRepository->remove($reverseEntity, $recursive);
}
}
}
}
}
if ($entity->isPersisted()) {
$this->mapper->remove($entity);
$this->identityMap->remove($entity->getPersistedId());
$this->entitiesToFlush[1][] = $entity;
}
$this->detach($entity);
$this->fireEvent($entity, 'onAfterRemove');
unset($this->isProcessing[spl_object_hash($entity)]);
return $entity;
}