diff --git a/wcfsetup/install/files/lib/data/CollectionDatabaseObject.class.php b/wcfsetup/install/files/lib/data/CollectionDatabaseObject.class.php new file mode 100644 index 00000000000..413d0d7e271 --- /dev/null +++ b/wcfsetup/install/files/lib/data/CollectionDatabaseObject.class.php @@ -0,0 +1,48 @@ + + * @since 6.2 + * + * @template TDatabaseObjectCollection of DatabaseObjectCollection + */ +abstract class CollectionDatabaseObject extends DatabaseObject +{ + /** + * @var TDatabaseObjectCollection + */ + protected DatabaseObjectCollection $collection; + + /** + * @param TDatabaseObjectCollection $collection + */ + public function setCollection(DatabaseObjectCollection $collection): void + { + $this->collection = $collection; + } + + /** + * @return TDatabaseObjectCollection + */ + public function getCollection(): DatabaseObjectCollection + { + if (!isset($this->collection)) { + $this->collection = new ($this->getCollectionClassName())([ + $this + ]); + } + + return $this->collection; + } + + public function getCollectionClassName(): string + { + return static::class . 'Collection'; + } +} diff --git a/wcfsetup/install/files/lib/data/DatabaseObjectCollection.class.php b/wcfsetup/install/files/lib/data/DatabaseObjectCollection.class.php new file mode 100644 index 00000000000..f919cece03a --- /dev/null +++ b/wcfsetup/install/files/lib/data/DatabaseObjectCollection.class.php @@ -0,0 +1,37 @@ + + * @since 6.2 + * + * @template TDatabaseObject of DatabaseObject + */ +abstract class DatabaseObjectCollection +{ + /** + * @param TDatabaseObject[] $objects + */ + public function __construct(protected readonly array $objects) {} + + /** + * @return int[] + */ + public function getObjectIDs(): array + { + return \array_map(static fn($object) => $object->getObjectID(), $this->objects); + } + + /** + * @return TDatabaseObject[] + */ + public function getObjects(): array + { + return $this->objects; + } +} diff --git a/wcfsetup/install/files/lib/data/DatabaseObjectList.class.php b/wcfsetup/install/files/lib/data/DatabaseObjectList.class.php index 8fbf2a390f5..97bd4fe857d 100644 --- a/wcfsetup/install/files/lib/data/DatabaseObjectList.class.php +++ b/wcfsetup/install/files/lib/data/DatabaseObjectList.class.php @@ -212,6 +212,8 @@ public function readObjects() $this->objects = $statement->fetchObjects(($this->objectClassName ?: $this->className)); } + $this->createCollection(); + // decorate objects if (!empty($this->decoratorClassName)) { foreach ($this->objects as &$object) { @@ -232,6 +234,22 @@ public function readObjects() $this->objects = $objects; } + /** + * @since 6.2 + */ + protected function createCollection(): void + { + $firstObject = \reset($this->objects); + if (!($firstObject instanceof CollectionDatabaseObject)) { + return; + } + + $collection = new ($firstObject->getCollectionClassName())($this->objects); + foreach ($this->objects as $object) { + $object->setCollection($collection); + } + } + /** * Returns the object ids of the list. *