View Issue Details

IDProjectCategoryView StatusLast Update
0000123GORM[Adventure PHP Framework] Neues Feature // New Featurepublic2014-01-15 13:31
ReporterScreezeAssigned To 
PrioritynormalSeverityfeatureReproducibilityN/A
Status newResolutionopen 
Product Version 
Target VersionFixed in Version 
Summary0000123: ORM / GDO: deleteObjectSubtree()
DescriptionIch wünsche mir eine Funktion wie z.B.:
$this->deleteObjectSubtree(); (im GDO)
bzw $orm->deleteObjectSubtree($obj); (im orm)

Mit folgendem Ziel:
Alle Objekte, die mit einer KOMPOSITION mit dem aktuellen Objekt verbunden sind (und zwar nur die, die von dem aktuellen Objekt abhängig sind) werden gelöscht (um das aktuelle Objekt später selbst löschen zu können)

Steps To ReproduceBeispiel:

ObjA |----> ObjB

$objA->deleteObjectSubtree();

bewirkt:
ObjB wird gelöscht
TagsNo tags attached.
Codereferenz: ([Datei]:[Zeile])

Activities

Screeze

2014-01-15 13:31

developer   ~0000175

Umsetzungsvorschlag (bereits getestet):

   protected function getCompositionNamesByObjectName($objectName, $direction = null) {

      // initialize list
      $relationList = array();

      // declare attribute to indicate the direction of the relation
      if ($direction == 'source') {
         $directionAttribute = 'SourceObject';
      } elseif ($direction == 'target') {
         $directionAttribute = 'TargetObject';
      } else {
         throw new GenericORMapperException('Direction of the composition not specified! Please '
               . 'use "source" or "target" as values!', E_USER_WARNING);
      }

      // look for suitable relation entries
      foreach ($this->relationTable as $sectionName => $attributes) {

         if ($attributes['Type'] == 'COMPOSITION' && $attributes[$directionAttribute] == $objectName) {
            $relationList[] = $sectionName;
         }
      }

      return $relationList;
   }
   
   public function deleteObjectSubTree(GenericORMapperDataObject $object) {
       // 1. get compositions, where source object is the current object
      $objectName = $object->getObjectName();
      $targetCompositions = $this->getCompositionNamesByObjectName($objectName, 'source');

      // 2. if the current object has child objects delete them
      foreach($targetCompositions as $compositionName) {
         $subObjects = $object->loadRelatedObjects($compositionName);
         foreach($subObjects as $obj) {
             $this->deleteObjectSubTree($obj);
             $this->deleteObject($obj);
         }
      }
   }

---

Die Helferfunktion könnte man evtl. mit der anderen getComposition*ByName zusammenführen, über die kommt man blos nicht mehr an den Namen der Beziehung, weshalb ich die quasi 1:1 kopieren und 1 Zeile ändern musste.

Zusätzlich könnte man überlegen in der deleteObject() Methode einen Flag-Parameter anzugeben, ob zuerst die Subtree gelöscht wird.

Issue History

Date Modified Username Field Change
2014-01-15 13:05 Screeze New Issue
2014-01-15 13:31 Screeze Note Added: 0000175