diff --git a/DataStorage/Database/Mapper/DataMapperFactory.php b/DataStorage/Database/Mapper/DataMapperFactory.php index 6452df2f4..c1eaff4da 100755 --- a/DataStorage/Database/Mapper/DataMapperFactory.php +++ b/DataStorage/Database/Mapper/DataMapperFactory.php @@ -85,7 +85,7 @@ class DataMapperFactory * * Relation is defined in current mapper * - * @var array + * @var array * @since 1.0.0 */ public const OWNS_ONE = []; @@ -93,7 +93,7 @@ class DataMapperFactory /** * Belongs to. * - * @var array + * @var array * @since 1.0.0 */ public const BELONGS_TO = []; @@ -109,7 +109,7 @@ class DataMapperFactory /** * Parent column. * - * @var string + * @var class-string * @since 1.0.0 */ public const PARENT = ''; @@ -117,11 +117,19 @@ class DataMapperFactory /** * Model to use by the mapper. * - * @var string + * @var class-string * @since 1.0.0 */ public const MODEL = ''; + /** + * Model factory to use by the mapper. + * + * @var class-string + * @since 1.0.0 + */ + public const FACTORY = ''; + /** * Database connection. * @@ -387,15 +395,21 @@ class DataMapperFactory /** * Create the empty base model * + * @param null|array $data Data to use for initialization + * * @return object * * @since 1.0.0 */ - public static function createBaseModel() : object + public static function createBaseModel(array $data = null) : object { - $class = empty(static::MODEL) ? \substr(static::class, 0, -6) : static::MODEL; + if (empty(static::FACTORY)) { + $class = empty(static::MODEL) ? \substr(static::class, 0, -6) : static::MODEL; - return new $class(); + return new $class(); + } + + return static::FACTORY::createWith($data); } /** diff --git a/DataStorage/Database/Mapper/ReadMapper.php b/DataStorage/Database/Mapper/ReadMapper.php index 421968964..684483a11 100755 --- a/DataStorage/Database/Mapper/ReadMapper.php +++ b/DataStorage/Database/Mapper/ReadMapper.php @@ -187,7 +187,7 @@ final class ReadMapper extends DataMapperAbstract foreach ($dbData as $row) { $value = $row[$this->mapper::PRIMARYFIELD . '_d' . $this->depth]; - $obj[$value] = $this->mapper::createBaseModel(); + $obj[$value] = $this->mapper::createBaseModel($row); $obj[$value] = $this->populateAbstract($row, $obj[$value]); $this->loadHasManyRelations($obj[$value]); @@ -743,7 +743,7 @@ final class ReadMapper extends DataMapperAbstract $ownsOneMapper = $this->createRelationMapper($mapper::get($this->db), $member); $ownsOneMapper->depth = $this->depth + 1; - return $ownsOneMapper->populateAbstract($result, $mapper::createBaseModel()); + return $ownsOneMapper->populateAbstract($result, $mapper::createBaseModel($result)); } /** @@ -804,7 +804,7 @@ final class ReadMapper extends DataMapperAbstract $belongsToMapper = $this->createRelationMapper($mapper::get($this->db), $member); $belongsToMapper->depth = $this->depth + 1; - return $belongsToMapper->populateAbstract($result, $mapper::createBaseModel()); + return $belongsToMapper->populateAbstract($result, $mapper::createBaseModel($result)); } /**