diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php index a726a81..3939b7a 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntity.class.php @@ -124,6 +124,7 @@ abstract class DatabaseEntity implements ArrayAccess, JsonSerializable { public function preInsert(array &$row) { } public function postFetch(SQL $sql, array $row) { } + public function postUpdate() { } public static function getPredefinedValues(): array { return []; } public function postDelete() { } diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php index c194f22..182dea2 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityHandler.php @@ -578,30 +578,31 @@ class DatabaseEntityHandler implements Persistable { $otherHandler = $nmRelation->getRelHandler(); $thisIdColumn = $otherHandler->getColumnName($nmRelation->getThisProperty(), false); $relIdColumn = $otherHandler->getColumnName($nmRelation->getRefProperty(), false); + if (!empty($entityIds)) { + $relEntityQuery = DatabaseEntityQuery::fetchAll($otherHandler) + ->where(new CondIn(new Column($thisIdColumn), $entityIds)); - $relEntityQuery = DatabaseEntityQuery::fetchAll($otherHandler) - ->where(new CondIn(new Column($thisIdColumn), $entityIds)); + if ($recursive) { + $relEntityQuery->fetchEntities(true); + } - if ($recursive) { - $relEntityQuery->fetchEntities(true); - } + $rows = $relEntityQuery->executeSQL(); + if (!is_array($rows)) { + $this->logger->error("Error fetching n:m relations from table: '$nmTable': " . $this->sql->getLastError()); + return; + } - $rows = $relEntityQuery->executeSQL(); - if (!is_array($rows)) { - $this->logger->error("Error fetching n:m relations from table: '$nmTable': " . $this->sql->getLastError()); - return; - } + $thisIdProperty = $otherHandler->properties[$nmRelation->getThisProperty()]; + $thisIdProperty->setAccessible(true); - $thisIdProperty = $otherHandler->properties[$nmRelation->getThisProperty()]; - $thisIdProperty->setAccessible(true); - - foreach ($rows as $row) { - $relEntity = $otherHandler->entityFromRow($row, [], $recursive); - $thisEntity = $entities[$row[$thisIdColumn]]; - $thisIdProperty->setValue($relEntity, $thisEntity); - $targetArray = $property->getValue($thisEntity); - $targetArray[$row[$relIdColumn]] = $relEntity; - $property->setValue($thisEntity, $targetArray); + foreach ($rows as $row) { + $relEntity = $otherHandler->entityFromRow($row, [], $recursive); + $thisEntity = $entities[$row[$thisIdColumn]]; + $thisIdProperty->setValue($relEntity, $thisEntity); + $targetArray = $property->getValue($thisEntity); + $targetArray[$row[$relIdColumn]] = $relEntity; + $property->setValue($thisEntity, $targetArray); + } } } else { $this->logger->error("fetchNMRelations for type '" . get_class($nmRelation) . "' is not implemented"); @@ -785,6 +786,7 @@ class DatabaseEntityHandler implements Persistable { $res = $this->updateNM($entity, $properties); } + $entity->postUpdate(); return $res; } diff --git a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php index 2bf61fc..ef92954 100644 --- a/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php +++ b/Core/Objects/DatabaseEntity/Controller/DatabaseEntityQuery.class.php @@ -103,6 +103,11 @@ class DatabaseEntityQuery extends Select { private function fetchRelation(string $propertyName, string $tableName, DatabaseEntityHandler $src, DatabaseEntityHandler $relationHandler, int &$relIndex = 1, bool $recursive = false, string $relationColumnPrefix = "") { + // TODO: fix recursion here... + if ($src === $relationHandler && $recursive) { + return; + } + $columns = $src->getColumns(); $foreignColumn = $columns[$propertyName];