Nextras\Orm\Repository\RemovalHelper::getCascadeQueueAndSetNulls PHP Метод

getCascadeQueueAndSetNulls() публичный статический Метод

public static getCascadeQueueAndSetNulls ( Nextras\Orm\Entity\IEntity $entity, Nextras\Orm\Model\IModel $model, $withCascade, &$queuePersist, &$queueRemove )
$entity Nextras\Orm\Entity\IEntity
$model Nextras\Orm\Model\IModel
    public static function getCascadeQueueAndSetNulls(IEntity $entity, IModel $model, $withCascade, &$queuePersist, &$queueRemove)
    {
        $entityHash = spl_object_hash($entity);
        if (isset($queueRemove[$entityHash])) {
            return;
        }
        $repository = $model->getRepositoryForEntity($entity);
        $repository->attach($entity);
        $repository->doFireEvent($entity, 'onBeforeRemove');
        list($pre, $post, $nulls) = static::getRelationships($entity);
        $prePersist = [];
        static::setNulls($entity, $nulls, $model, $prePersist);
        if (!$withCascade) {
            $queueRemove[$entityHash] = $entity;
            return;
        }
        foreach ($prePersist as $value) {
            $queuePersist[spl_object_hash($value)] = $value;
        }
        foreach ($pre as $value) {
            if ($value instanceof IEntity) {
                static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
            } elseif ($value instanceof IRelationshipCollection) {
                foreach ($value->getIterator() as $subValue) {
                    static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
                }
                $queuePersist[spl_object_hash($value)] = $value;
            }
        }
        $queueRemove[$entityHash] = $entity;
        unset($queuePersist[$entityHash]);
        foreach ($post as $value) {
            if ($value instanceof IEntity) {
                static::getCascadeQueueAndSetNulls($value, $model, true, $queuePersist, $queueRemove);
            } elseif ($value instanceof IRelationshipCollection) {
                foreach ($value->getIterator() as $subValue) {
                    static::getCascadeQueueAndSetNulls($subValue, $model, true, $queuePersist, $queueRemove);
                }
                $queuePersist[spl_object_hash($value)] = $value;
            }
        }
    }

Usage Example

Пример #1
0
 public function remove(IEntity $entity, $withCascade = TRUE)
 {
     $queuePersist = $queueRemove = [];
     RemovalHelper::getCascadeQueueAndSetNulls($entity, $this, $withCascade, $queuePersist, $queueRemove);
     foreach ($queuePersist as $object) {
         if ($object instanceof IEntity) {
             $repository = $this->configuration[2][get_class($object)];
             $this->loader->getRepository($repository)->doPersist($object);
         } elseif ($object instanceof IRelationshipCollection) {
             $object->doPersist();
         }
     }
     foreach ($queueRemove as $object) {
         $repository = $this->configuration[2][get_class($object)];
         $this->loader->getRepository($repository)->doRemove($object);
     }
     return $entity;
 }