bug fixes after datamapper changes

This commit is contained in:
Dennis Eichhorn 2020-03-14 17:58:43 +01:00
parent 7a5fad6659
commit d81bf80ada
6 changed files with 93 additions and 34 deletions

View File

@ -1910,7 +1910,7 @@ class DataMapperAbstract implements DataMapperInterface
return []; return [];
} }
$obj = $mapper::getInitialized($mapper, $result[$mapper::$primaryField . '_' . $depth]); $obj = $mapper::getInitializedArray($mapper, $result[$mapper::$primaryField . '_' . $depth]);
return $obj ?? $mapper::populateAbstractArray($result, [], $depth); return $obj ?? $mapper::populateAbstractArray($result, [], $depth);
} }
@ -1941,7 +1941,7 @@ class DataMapperAbstract implements DataMapperInterface
return $mapper::createNullModel(); return $mapper::createNullModel();
} }
$obj = $mapper::getInitializedArray($mapper, $result[$mapper::$primaryField . '_' . $depth]); $obj = $mapper::getInitialized($mapper, $result[$mapper::$primaryField . '_' . $depth]);
return $obj ?? $mapper::populateAbstract($result, $mapper::createBaseModel(), $depth); return $obj ?? $mapper::populateAbstract($result, $mapper::createBaseModel(), $depth);
} }
@ -1995,7 +1995,7 @@ class DataMapperAbstract implements DataMapperInterface
foreach (static::$columns as $column => $def) { foreach (static::$columns as $column => $def) {
$alias = $column . '_' . $depth; $alias = $column . '_' . $depth;
if (!isset($result[$alias])) { if (!\array_key_exists($alias, $result)) {
continue; continue;
} }
@ -2078,7 +2078,7 @@ class DataMapperAbstract implements DataMapperInterface
$column = $def['mapper']::getColumnByMember($member); $column = $def['mapper']::getColumnByMember($member);
$alias = $column . '_' . ($depth - 1); $alias = $column . '_' . ($depth - 1);
if (!isset($result[$alias]) || !isset($def['column'])) { if (!\array_key_exists($alias, $result) || !isset($def['column'])) {
continue; continue;
} }
@ -2153,11 +2153,15 @@ class DataMapperAbstract implements DataMapperInterface
*/ */
public static function populateAbstractArray(array $result, array $obj = [], int $depth = 3) : array public static function populateAbstractArray(array $result, array $obj = [], int $depth = 3) : array
{ {
foreach ($result as $column => $value) { foreach (static::$columns as $column => $def) {
if (!isset(static::$columns[$column]['internal'])) { $alias = $column . '_' . $depth;
if (!\array_key_exists($alias, $result)) {
continue; continue;
} }
$value = $result[$alias];
$path = static::$columns[$column]['internal']; $path = static::$columns[$column]['internal'];
if (\stripos($path, '/') !== false) { if (\stripos($path, '/') !== false) {
$path = \explode('/', $path); $path = \explode('/', $path);
@ -2166,9 +2170,17 @@ class DataMapperAbstract implements DataMapperInterface
$path = \implode('/', $path); $path = \implode('/', $path);
} }
if (isset(static::$ownsOne[static::$columns[$column]['internal']])) { if (isset(static::$ownsOne[$def['internal']])) {
if ($depth - 1 < 1) {
continue;
}
$value = self::populateOwnsOneArray(static::$columns[$column]['internal'], $result, $depth - 1); $value = self::populateOwnsOneArray(static::$columns[$column]['internal'], $result, $depth - 1);
} elseif (isset(static::$belongsTo[static::$columns[$column]['internal']])) { } elseif (isset(static::$belongsTo[$def['internal']])) {
if ($depth - 1 < 1) {
continue;
}
$value = self::populateBelongsToArray(static::$columns[$column]['internal'], $result, $depth - 1); $value = self::populateBelongsToArray(static::$columns[$column]['internal'], $result, $depth - 1);
} elseif (\in_array(static::$columns[$column]['type'], ['string', 'int', 'float', 'bool'])) { } elseif (\in_array(static::$columns[$column]['type'], ['string', 'int', 'float', 'bool'])) {
\settype($value, static::$columns[$column]['type']); \settype($value, static::$columns[$column]['type']);
@ -2181,6 +2193,28 @@ class DataMapperAbstract implements DataMapperInterface
$obj = ArrayUtils::setArray($path, $obj, $value, '/', true); $obj = ArrayUtils::setArray($path, $obj, $value, '/', true);
} }
foreach (static::$hasMany as $member => $def) {
$column = $def['mapper']::getColumnByMember($member);
$alias = $column . '_' . ($depth - 1);
if (!\array_key_exists($alias, $result) || !isset($def['column'])) {
continue;
}
$value = $result[$alias];
$path = $member;
if (\in_array($def['mapper']::$columns[$column]['type'], ['string', 'int', 'float', 'bool'])) {
\settype($value, $def['mapper']::$columns[$column]['type']);
} elseif ($def['mapper']::$columns[$column]['type'] === 'DateTime') {
$value = $value === null ? null : new \DateTime($value);
} elseif ($def['mapper']::$columns[$column]['type'] === 'Json') {
$value = \json_decode($value, true);
}
$obj = ArrayUtils::setArray($path, $obj, $value, '/', true);
}
return $obj; return $obj;
} }
@ -2338,25 +2372,15 @@ class DataMapperAbstract implements DataMapperInterface
unset($keys[$key]); unset($keys[$key]);
} }
if (empty($keys) && $primaryKey !== null) { if (!empty($keys) || $primaryKey === null) {
$countResulsts = \count($obj); $dbData = self::getRaw($keys, $relations, $depth, $ref, $query);
foreach ($dbData as $row) {
$value = $row[static::$primaryField . '_' . $depth];
$obj[$value] = self::createBaseModel();
self::addInitialized(static::class, $value, $obj[$value]);
if ($countResulsts === 0) { $obj[$value] = self::populateAbstract($row, $obj[$value], $depth);
return self::createNullModel();
} elseif ($countResulsts === 1) {
return \reset($obj);
} }
return $obj;
}
$dbData = self::getRaw($keys, $relations, $depth, $ref, $query);
foreach ($dbData as $row) {
$value = $row[static::$primaryField . '_' . $depth];
$obj[$value] = self::createBaseModel();
self::addInitialized(static::class, $value, $obj[$value]);
$obj[$value] = self::populateAbstract($row, $obj[$value], $depth);
} }
self::fillRelations($obj, $relations, $depth - 1); self::fillRelations($obj, $relations, $depth - 1);
@ -2514,6 +2538,12 @@ class DataMapperAbstract implements DataMapperInterface
{ {
$result = self::get(null, $relations, $depth); $result = self::get(null, $relations, $depth);
if (\is_object($result)) {
if (\stripos(\get_class($result), '\Null') !== false) {
return [];
}
}
return !\is_array($result) ? [$result] : $result; return !\is_array($result) ? [$result] : $result;
} }
@ -2531,7 +2561,7 @@ class DataMapperAbstract implements DataMapperInterface
{ {
$result = self::getArray(null, $relations, $depth); $result = self::getArray(null, $relations, $depth);
return !\is_array($result) ? [$result] : $result; return !\is_array(\reset($result)) ? [$result] : $result;
} }
/** /**
@ -2577,6 +2607,12 @@ class DataMapperAbstract implements DataMapperInterface
{ {
$result = self::get(null, $relations, $depth, null, $query); $result = self::get(null, $relations, $depth, null, $query);
if (\is_object($result)) {
if (\stripos(\get_class($result), '\Null') !== false) {
return [];
}
}
return !\is_array($result) ? [$result] : $result; return !\is_array($result) ? [$result] : $result;
} }
@ -3070,6 +3106,19 @@ class DataMapperAbstract implements DataMapperInterface
} }
} }
/**
* Clear cache
*
* @return mixed
*
* @since 1.0.0
*/
public static function clearCache()
{
self::$initObjects = [];
self::$initArrays = [];
}
/** /**
* Find database column name by member name * Find database column name by member name
* *

View File

@ -555,7 +555,7 @@ class Builder extends BuilderAbstract
$i = 0; $i = 0;
foreach ($columns as $column) { foreach ($columns as $column) {
if (isset($operator[$i]) && !\in_array(\strtolower($operator[$i]), self::OPERATORS)) { if (isset($operator[$i]) && !\in_array(\strtolower($operator[$i]), self::OPERATORS)) {
throw new \InvalidArgumentException('Unknown operator.'); throw new \InvalidArgumentException('Unknown operator: "' . $operator[$i] . '"');
} }
$this->wheres[self::getPublicColumnName($column)][] = [ $this->wheres[self::getPublicColumnName($column)][] = [

View File

@ -75,7 +75,7 @@ class MysqlGrammar extends Grammar
$builder->select('*') $builder->select('*')
->from('information_schema.columns') ->from('information_schema.columns')
->where('table_schema', '=', $query->getConnection()->getDatabase()) ->where('table_schema', '=', $query->getConnection()->getDatabase())
->andWhere('table_name', '=' . $table); ->andWhere('table_name', '=', $table);
return \rtrim($builder->toSql(), ';'); return \rtrim($builder->toSql(), ';');
} }

View File

@ -218,7 +218,11 @@ class DataMapperAbstractTest extends \PHPUnit\Framework\TestCase
self::assertEquals($this->model->belongsToOne->string, $modelR->belongsToOne->string); self::assertEquals($this->model->belongsToOne->string, $modelR->belongsToOne->string);
$for = ManyToManyDirectModelMapper::getFor($id, 'to'); $for = ManyToManyDirectModelMapper::getFor($id, 'to');
self::assertEquals(\reset($this->model->hasManyDirect)->string, \reset($for)->string);
self::assertEquals(
\reset($this->model->hasManyDirect)->string,
$for->string
);
self::assertCount(1, BaseModelMapper::getAll()); self::assertCount(1, BaseModelMapper::getAll());
} }
@ -250,7 +254,10 @@ class DataMapperAbstractTest extends \PHPUnit\Framework\TestCase
self::assertEquals($this->modelArray['belongsToOne']['string'], $modelR['belongsToOne']['string']); self::assertEquals($this->modelArray['belongsToOne']['string'], $modelR['belongsToOne']['string']);
$for = ManyToManyDirectModelMapper::getForArray($id, 'to'); $for = ManyToManyDirectModelMapper::getForArray($id, 'to');
self::assertEquals(\reset($this->modelArray['hasManyDirect'])['string'], \reset($for)['string']); self::assertEquals(
\reset($this->modelArray['hasManyDirect'])['string'],
\reset($for)['string']
);
self::assertCount(1, BaseModelMapper::getAllArray()); self::assertCount(1, BaseModelMapper::getAllArray());
} }

View File

@ -46,15 +46,15 @@ class BaseModelMapper extends DataMapperAbstract
*/ */
protected static array $belongsTo = [ protected static array $belongsTo = [
'belongsToOne' => [ 'belongsToOne' => [
'mapper' => BelongsToModelMapper::class, 'mapper' => BelongsToModelMapper::class,
'dest' => 'test_base_belongs_to_one', 'self' => 'test_base_belongs_to_one',
], ],
]; ];
protected static array $ownsOne = [ protected static array $ownsOne = [
'ownsOneSelf' => [ 'ownsOneSelf' => [
'mapper' => OwnsOneModelMapper::class, 'mapper' => OwnsOneModelMapper::class,
'dest' => 'test_base_owns_one_self', 'self' => 'test_base_owns_one_self',
], ],
]; ];

View File

@ -17,6 +17,7 @@ namespace phpOMS\tests\Module;
require_once __DIR__ . '/../Autoloader.php'; require_once __DIR__ . '/../Autoloader.php';
use phpOMS\Application\ApplicationAbstract; use phpOMS\Application\ApplicationAbstract;
use phpOMS\DataStorage\Database\RelationType;
use phpOMS\Event\EventManager; use phpOMS\Event\EventManager;
use phpOMS\Message\Http\HttpRequest; use phpOMS\Message\Http\HttpRequest;
use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\HttpResponse;
@ -212,6 +213,8 @@ class ModuleAbstractTest extends \PHPUnit\Framework\TestCase
private function dbSetup() : void private function dbSetup() : void
{ {
BaseModelMapper::clearCache();
$GLOBALS['dbpool']->get()->con->prepare( $GLOBALS['dbpool']->get()->con->prepare(
'CREATE TABLE `test_base` ( 'CREATE TABLE `test_base` (
`test_base_id` int(11) NOT NULL AUTO_INCREMENT, `test_base_id` int(11) NOT NULL AUTO_INCREMENT,