From 22cd674189c66e1b44de5b5a5b4bd115348b54ce Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 6 Feb 2021 13:47:12 +0100 Subject: [PATCH] improve country handling --- DataStorage/Database/DataMapperAbstract.php | 34 +++++++++++++++-- DataStorage/Database/GrammarAbstract.php | 4 ++ DataStorage/Database/Query/Builder.php | 1 + Localization/Defaults/Country.php | 40 ++++++++++++++++++++ Localization/Defaults/CountryMapper.php | 2 + Localization/Defaults/localization.sqlite | Bin 24178688 -> 24178688 bytes 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/DataStorage/Database/DataMapperAbstract.php b/DataStorage/Database/DataMapperAbstract.php index b916bbbe8..3ca6d8743 100644 --- a/DataStorage/Database/DataMapperAbstract.php +++ b/DataStorage/Database/DataMapperAbstract.php @@ -249,6 +249,14 @@ class DataMapperAbstract implements DataMapperInterface */ protected static string $datetimeFormat = 'Y-m-d H:i:s'; + /** + * Raw query data from last query + * + * @var array + * @since 1.0.0 + */ + protected static array $lastQueryData = []; + /** * Constructor. * @@ -1449,6 +1457,11 @@ class DataMapperAbstract implements DataMapperInterface */ private static function updateModel(object $obj, mixed $objId, \ReflectionClass $refClass = null, int $depth = 1) : void { + // Model doesn't have anything to update + if (\count(static::$columns) < 2) { + return; + } + $query = new Builder(self::$db); $query->update(static::$table) ->where(static::$table . '.' . static::$primaryField, '=', $objId); @@ -1507,9 +1520,14 @@ class DataMapperAbstract implements DataMapperInterface } } - $sth = self::$db->con->prepare($query->toSql()); - if ($sth !== false) { - $sth->execute(); + try { + $sth = self::$db->con->prepare($query->toSql()); + if ($sth !== false) { + $sth->execute(); + } + } catch (\Throwable $t) { + echo $t->getMessage(); + echo $query->toSql(); } } @@ -2641,6 +2659,11 @@ class DataMapperAbstract implements DataMapperInterface if (!empty($keys) || $primaryKey === null) { $dbData = self::getRaw($keys, self::$relations, $depth, $ref, $query); + + if (static::class === self::$parentMapper) { + static::$lastQueryData = $dbData; + } + foreach ($dbData as $row) { $value = $row[static::$primaryField . '_' . $depth]; $obj[$value] = self::createBaseModel(); @@ -2664,6 +2687,11 @@ class DataMapperAbstract implements DataMapperInterface return $obj; } + public static function getDataLastQuery() : array + { + return static::$lastQueryData; + } + /** * Get object. * diff --git a/DataStorage/Database/GrammarAbstract.php b/DataStorage/Database/GrammarAbstract.php index d8862eeac..b948364e4 100644 --- a/DataStorage/Database/GrammarAbstract.php +++ b/DataStorage/Database/GrammarAbstract.php @@ -84,6 +84,10 @@ abstract class GrammarAbstract 'COUNT(', 'MAX(', 'MIN(', + 'SUM(', + 'DATE(', + 'YEAR(', + 'MONTH(', ]; /** diff --git a/DataStorage/Database/Query/Builder.php b/DataStorage/Database/Query/Builder.php index 150775cb4..271366bf5 100644 --- a/DataStorage/Database/Query/Builder.php +++ b/DataStorage/Database/Query/Builder.php @@ -1402,6 +1402,7 @@ class Builder extends BuilderAbstract public function execute() : mixed { try { + $t = $this->toSql(); $sth = $this->connection->con->prepare($this->toSql()); foreach ($this->binds as $key => $bind) { diff --git a/Localization/Defaults/Country.php b/Localization/Defaults/Country.php index 2da04b64e..941101ca1 100644 --- a/Localization/Defaults/Country.php +++ b/Localization/Defaults/Country.php @@ -72,6 +72,22 @@ class Country */ protected string $subdevision = ''; + /** + * Country region. + * + * @var string + * @since 1.0.0 + */ + protected string $region = ''; + + /** + * Country developed. + * + * @var string + * @since 1.0.0 + */ + protected bool $isDeveloped = false; + /** * Get id * @@ -143,4 +159,28 @@ class Country { return $this->subdevision; } + + /** + * Get country region + * + * @return string + * + * @since 1.0.0 + */ + public function getRegion() : string + { + return $this->region; + } + + /** + * Is country developed + * + * @return bool + * + * @since 1.0.0 + */ + public function isDeveloped() : bool + { + return $this->isDeveloped; + } } diff --git a/Localization/Defaults/CountryMapper.php b/Localization/Defaults/CountryMapper.php index 02577ef91..590e3ae9a 100644 --- a/Localization/Defaults/CountryMapper.php +++ b/Localization/Defaults/CountryMapper.php @@ -38,6 +38,8 @@ class CountryMapper extends DataMapperAbstract 'country_code2' => ['name' => 'country_code2', 'type' => 'string', 'internal' => 'code2'], 'country_code3' => ['name' => 'country_code3', 'type' => 'string', 'internal' => 'code3'], 'country_numeric' => ['name' => 'country_numeric', 'type' => 'int', 'internal' => 'numeric'], + 'country_region' => ['name' => 'country_region', 'type' => 'string', 'internal' => 'region'], + 'country_developed' => ['name' => 'country_developed', 'type' => 'bool', 'internal' => 'isDeveloped'], ]; /** diff --git a/Localization/Defaults/localization.sqlite b/Localization/Defaults/localization.sqlite index 555daaee8083ad28a2a7a52cae1dec7657466835..a87dc72491649c20502c58ab5fbd844511199ff4 100644 GIT binary patch delta 11123 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 delta 11286 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