diff --git a/src/Interfaces/PersistentData/IPersistentDataManager.php b/src/Interfaces/PersistentData/IPersistentDataManager.php index c6c931d..7978fc7 100644 --- a/src/Interfaces/PersistentData/IPersistentDataManager.php +++ b/src/Interfaces/PersistentData/IPersistentDataManager.php @@ -10,9 +10,9 @@ interface IPersistentDataManager public function selectMultipleFromDb(Select $select, string $type, bool $useRelations = false, array $withRelations = []): Generator; - public function selectFromDbById($id, string $type, bool $useRelations = false); + public function selectFromDbById($id, string $type, bool $useRelations = false, array $withRelations = []); - public function loadRelationsFromDb(Model $model, bool $recursive): void; + public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void; public function saveToDb(Model $model): void; diff --git a/src/PersistentData/PersistentDataManager.php b/src/PersistentData/PersistentDataManager.php index 4388d9f..c203b8b 100644 --- a/src/PersistentData/PersistentDataManager.php +++ b/src/PersistentData/PersistentDataManager.php @@ -50,19 +50,19 @@ class PersistentDataManager implements IPersistentDataManager } } - public function selectFromDbById($id, string $type, bool $useRelations = false) + public function selectFromDbById($id, string $type, bool $useRelations = false, array $withRelations = []) { $select = new Select($this->dbConnection); $select->whereId($id); - return $this->selectFromDb($select, $type, $useRelations); + return $this->selectFromDb($select, $type, $useRelations, $withRelations); } public function fillWithData(array &$data, Model $model, array $withRelations = [], ?string $modelKey = null): void { $relations = $model::getRelations(); if (count($withRelations)) { - $relations = array_intersect($relations, $withRelations); + $relations = array_intersect_key($relations, array_flip($withRelations)); } while (key($data)) { @@ -105,9 +105,14 @@ class PersistentDataManager implements IPersistentDataManager $model->saveSnapshot(); } - public function loadRelationsFromDb(Model $model, bool $recursive): void + public function loadRelationsFromDb(Model $model, bool $recursive = false, array $withRelations = []): void { - foreach ($model::getRelations() as $relation => $relationType) { + $relations = $model::getRelations(); + if (count($withRelations)) { + $relations = array_intersect_key($relations, array_flip($withRelations)); + } + + foreach ($relations as $relation => $relationType) { $camel = str_replace('_', '', ucwords($relation, '_')); $methodGet = 'get' . $camel . 'Id'; @@ -116,7 +121,7 @@ class PersistentDataManager implements IPersistentDataManager $relationId = $model->$methodGet(); if ($relationId !== null) { - $relationModel = $this->selectFromDbById($relationId, $relationType, $recursive); + $relationModel = $this->selectFromDbById($relationId, $relationType, $recursive, $withRelations); $model->$methodSet($relationModel); } @@ -187,7 +192,7 @@ class PersistentDataManager implements IPersistentDataManager if ($useRelations) { $relations = call_user_func([$type, 'getRelations']); if (count($withRelations)) { - $relations = array_intersect($relations, $withRelations); + $relations = array_intersect_key($relations, array_flip($withRelations)); } $columns = array_merge($columns, $this->getRelationColumns($relations, $withRelations)); @@ -211,11 +216,11 @@ class PersistentDataManager implements IPersistentDataManager $columns[] = [$relationTable, $relationField, $relation . '__' . $relationField]; } - $nextOrderRelations = call_user_func([$relationType, 'getRelations']); + $relationsOfRelation = call_user_func([$relationType, 'getRelations']); if (count($withRelations)) { - $nextOrderRelations = array_intersect($nextOrderRelations, $withRelations); + $relationsOfRelation = array_intersect_key($relationsOfRelation, array_flip($withRelations)); } - $columns = array_merge($columns, $this->getRelationColumns($nextOrderRelations, $withRelations)); + $columns = array_merge($columns, $this->getRelationColumns($relationsOfRelation, $withRelations)); } return $columns; @@ -229,7 +234,7 @@ class PersistentDataManager implements IPersistentDataManager $nextOrderRelations = call_user_func([$relationType, 'getRelations']); if (count($withRelations)) { - $nextOrderRelations = array_intersect($nextOrderRelations, $withRelations); + $nextOrderRelations = array_intersect_key($nextOrderRelations, array_flip($withRelations)); } $this->leftJoinRelations($select, $relationTable, $nextOrderRelations, $withRelations); }