diff --git a/Account/Account.php b/Account/Account.php index 27606dad1..c173d65a5 100644 --- a/Account/Account.php +++ b/Account/Account.php @@ -441,7 +441,7 @@ class Account implements ArrayableInterface, \JsonSerializable */ public function getCreatedAt() : \DateTime { - return $this->createdAt ?? new \DateTime('NOW'); + return $this->createdAt; } /** @@ -489,7 +489,7 @@ class Account implements ArrayableInterface, \JsonSerializable */ public function updateLastActive() : void { - $this->lastActive = new \DateTime('NOW'); + $this->lastActive = new \DateTime('now'); } /** diff --git a/DataStorage/Database/DataMapperAbstract.php b/DataStorage/Database/DataMapperAbstract.php index 2f57d6fa9..f1c118795 100644 --- a/DataStorage/Database/DataMapperAbstract.php +++ b/DataStorage/Database/DataMapperAbstract.php @@ -2071,13 +2071,19 @@ class DataMapperAbstract implements DataMapperInterface { $mapper = static::$ownsOne[$member]['mapper']; - if (!isset(static::$ownsOne[$member]['by'])) { - $value = self::getInitialized($mapper, $id) ?? $mapper::get($id, RelationType::ALL, null, $depth); - } else { - $value = $mapper::getBy($id, static::$ownsOne[$member]['by'], RelationType::ALL, null, $depth); + if (isset(static::$ownsOne[$member]['column'])) { + if (!isset(static::$ownsOne[$member]['by'])) { + return $mapper::getColumn($id, static::$ownsOne[$member]['column']); + } + + return $mapper::getByColumn($id, static::$ownsOne[$member]['by'], static::$ownsOne[$member]['column']); } - return $value; + if (!isset(static::$ownsOne[$member]['by'])) { + return self::getInitialized($mapper, $id) ?? $mapper::get($id, RelationType::ALL, null, $depth); + } + + return $mapper::getBy($id, static::$ownsOne[$member]['by'], RelationType::ALL, null, $depth); } /** @@ -2145,6 +2151,10 @@ class DataMapperAbstract implements DataMapperInterface { $mapper = static::$belongsTo[$member]['mapper']; + if (isset(static::$belongsTo[$member]['column'])) { + return $mapper::getColumn($id, static::$belongsTo[$member]['column']); + } + return self::getInitialized($mapper, $id) ?? $mapper::get($id, RelationType::ALL, null, $depth); } @@ -2493,6 +2503,45 @@ class DataMapperAbstract implements DataMapperInterface return $obj; } + /** + * Get object. + * + * @param mixed $primaryKey Key + * @param string $member Member to load + * + * @return mixed + * + * @since 1.0.0 + */ + public static function getColumn($primaryKey, string $member) + { + if (!isset(self::$parentMapper)) { + self::$parentMapper = static::class; + } + + self::extend(__CLASS__); + + $primaryKey = (array) $primaryKey; + $columnValue = []; + + foreach ($primaryKey as $key => $value) { + $dbData = self::getRaw($value); + $columnValue[] = $dbData[self::getColumnByMember($member)]; + } + + self::clear(); + + $countResulsts = \count($columnValue); + + if ($countResulsts === 0) { + return self::createNullModel(); + } elseif ($countResulsts === 1) { + return \reset($columnValue); + } + + return $columnValue; + } + /** * Get object. * @@ -2620,7 +2669,7 @@ class DataMapperAbstract implements DataMapperInterface if (isset(static::$hasMany[$by]) && static::$hasMany[$by]['self'] !== null) { // todo: maybe wrong?! $toLoad = self::getHasManyPrimaryKeys($value, $by); - } elseif (isset(static::$ownsOne[$by])) { + } else { $toLoad = self::getPrimaryKeysBy($value, self::getColumnByMember($by)); } @@ -2638,6 +2687,53 @@ class DataMapperAbstract implements DataMapperInterface return $obj; } + /** + * Get column. + * + * @param mixed $byKey Key + * @param string $by The field that defines the for + * @param string $member Member to load + * + * @return mixed + * + * @since 1.0.0 + */ + public static function getByColumn($byKey, string $by, string $member) + { + if (!isset(self::$parentMapper)) { + self::$parentMapper = static::class; + } + + self::extend(__CLASS__); + + $byKey = (array) $byKey; + $columnValue = []; + + foreach ($byKey as $key => $value) { + $toLoad = []; + + if (isset(static::$hasMany[$by]) && static::$hasMany[$by]['self'] !== null) { + // todo: maybe wrong?! + $toLoad = self::getHasManyPrimaryKeys($value, $by); + } else { + $toLoad = self::getPrimaryKeysBy($value, self::getColumnByMember($by)); + } + + $columnValue[$value] = self::getColumn($toLoad, $member); + } + + $countResulsts = \count($columnValue); + + if ($countResulsts === 0) { + return self::createNullModel(); + } elseif ($countResulsts === 1) { + return \reset($columnValue); + } + + return $columnValue; + } + + /** * Get object. * diff --git a/Localization/Defaults/LanguageMapper.php b/Localization/Defaults/LanguageMapper.php index 2a7ac002f..36bdbcf08 100644 --- a/Localization/Defaults/LanguageMapper.php +++ b/Localization/Defaults/LanguageMapper.php @@ -34,11 +34,11 @@ class LanguageMapper extends DataMapperAbstract */ protected static array $columns = [ 'language_id' => ['name' => 'language_id', 'type' => 'int', 'internal' => 'id'], - 'language_native' => ['name' => 'language_native', 'type' => 'string', 'internal' => 'name'], - 'language_639_1' => ['name' => 'language_639_1', 'type' => 'string', 'internal' => 'native'], - 'language_639_2T' => ['name' => 'language_639_2T', 'type' => 'string', 'internal' => 'code2'], - 'language_639_2B' => ['name' => 'language_639_2B', 'type' => 'string', 'internal' => 'code3Native'], - 'language_639_3' => ['name' => 'language_639_3', 'type' => 'string', 'internal' => 'code3'], + 'language_name' => ['name' => 'language_name', 'type' => 'string', 'internal' => 'name'], + 'language_native' => ['name' => 'language_native', 'type' => 'string', 'internal' => 'native'], + 'language_639_1' => ['name' => 'language_639_1', 'type' => 'string', 'internal' => 'code2'], + 'language_639_2B' => ['name' => 'language_639_2B', 'type' => 'string', 'internal' => 'code3'], + 'language_639_2T' => ['name' => 'language_639_2T', 'type' => 'string', 'internal' => 'code3Native'], ]; /** diff --git a/Localization/Defaults/localization.sqlite b/Localization/Defaults/localization.sqlite index 854e6e0c8..93a5623cb 100644 Binary files a/Localization/Defaults/localization.sqlite and b/Localization/Defaults/localization.sqlite differ