private function deleteRelationshipsTraversal(Entity $metadata, $entity, Reader $reader, $local_id)
{
$relationships = $metadata->getRelationships();
$is_proxy = $entity instanceof OrmProxyInterface;
// If we're a proxy and modified the ID, get the un-modified ID else the result could be unexpected
if ($is_proxy) {
/** @var OrmProxyInterface $entity */
$local_id = $entity->getOriginalId();
}
/** @var Relationship $relationship */
foreach ($relationships as $relationship) {
$inverse_relationship = $relationship->getInversedBy() ? $this->invertRelationship($relationship) : null;
$forward_key = $this->getRelationshipKey($relationship, $local_id);
if (!$inverse_relationship) {
$value = $reader->getPropertyValue($relationship->getName());
$this->deleteRelationshipRefs($relationship, $value, $local_id);
}
// Delete relationship keys
if (RelationshipType::isMultiIndex($relationship->getRelationshipType())) {
// Delete to-many forward
$this->getDriver()->clearMultiValueIndex($forward_key);
// Get all foreign ID's to remove local
if ($relationship->getInversedBy()) {
$foreign_ids = $this->getDriver()->getMultiValueIndex($forward_key);
foreach ($foreign_ids as $foreign_id) {
$this->deleteInvertedRelationship($inverse_relationship, $foreign_id, $local_id);
}
}
} else {
// Delete to-one forward
$this->getDriver()->clearSingleValueIndex($forward_key);
// Get the foreign ID to remove local
if ($relationship->getInversedBy()) {
$foreign_id = $this->getDriver()->getSingleValueIndex($forward_key);
$this->deleteInvertedRelationship($inverse_relationship, $foreign_id, $local_id);
}
}
// Delete forward sort keys (inverse keys deleted in #deleteInvertedRelationship())
foreach ($relationship->getSortableBy() as $sortable) {
$forward_sort_key = $this->getSortIndexKey($relationship, $sortable->getName(), $local_id);
$this->getDriver()->clearSortedIndex($forward_sort_key);
}
}
}