diff --git a/src/Interfaces/PersistentData/IPersistentDataManager.php b/src/Interfaces/PersistentData/IPersistentDataManager.php index 6cdf496..09970ac 100644 --- a/src/Interfaces/PersistentData/IPersistentDataManager.php +++ b/src/Interfaces/PersistentData/IPersistentDataManager.php @@ -16,6 +16,8 @@ interface IPersistentDataManager public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void; + public function loadMultiRelationsFromDb(array $models, string $relation, bool $useRelations = false, array $withRelations = []): void; + public function saveToDb(Model $model): void; public function deleteFromDb(Model $model): void; diff --git a/src/PersistentData/Model/Model.php b/src/PersistentData/Model/Model.php index c5f566c..9c100ae 100644 --- a/src/PersistentData/Model/Model.php +++ b/src/PersistentData/Model/Model.php @@ -8,6 +8,8 @@ abstract class Model protected static array $relations = []; + protected static array $multiRelations = []; + protected $id = null; private array $snapshot = []; diff --git a/src/PersistentData/PersistentDataManager.php b/src/PersistentData/PersistentDataManager.php index 6547782..eccb659 100644 --- a/src/PersistentData/PersistentDataManager.php +++ b/src/PersistentData/PersistentDataManager.php @@ -92,6 +92,41 @@ class PersistentDataManager implements IPersistentDataManager } } + public function loadMultiRelationsFromDb(array $models, string $relation, bool $useRelations = false, array $withRelations = []): void + { + if (count($models) === 0) { + return; + } + + $parentModelType = get_class($models[0]); + $relationModelsSetter = 'set' . str_replace('_', '', ucwords($relation, '_')); + $relationModelType = $parentModelType::$multiRelations[$relation][0]; + $reverseRelation = $parentModelType::$multiRelations[$relation][1]; + $reverseRelationIdGetter = 'get' . str_replace('_', '', ucwords($reverseRelation, '_')) . 'Id'; + + $parentModelsById = []; + foreach ($models as $model) { + $parentModelsById[$model->getId()] = $model; + } + + $select = new Select($this->dbConnection); + $select->where($reverseRelation . '_id', 'IN', array_keys($parentModelsById)); + + $relationsByParentModelId = []; + foreach ($this->selectMultipleFromDb($select, $relationModelType, $useRelations, $withRelations) as $relationModel) { + $reverseRelationId = $relationModel->$reverseRelationIdGetter(); + if (!isset($relationsByParentModelId[$reverseRelationId])) { + $relationsByParentModelId[$reverseRelationId] = []; + } + $relationsByParentModelId[$reverseRelationId][] = $relationModel; + } + + foreach ($parentModelsById as $parentModelId => $parentModel) { + $relationModels = $relationsByParentModelId[$parentModelId] ?? []; + $parentModel->$relationModelsSetter($relationModels); + } + } + public function saveToDb(Model $model): void { $this->syncRelations($model);