Bravo3\Orm\Services\RelationshipManager::deleteRelationshipsTraversal PHP Method

deleteRelationshipsTraversal() private method

Traverse the given list of relationships and delete them
private deleteRelationshipsTraversal ( Entity $metadata, object $entity, Reader $reader, string $local_id )
$metadata Bravo3\Orm\Mappers\Metadata\Entity
$entity object
$reader Bravo3\Orm\Services\Io\Reader
$local_id string
    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);
            }
        }
    }