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 [];
}
$obj = $mapper::getInitialized($mapper, $result[$mapper::$primaryField . '_' . $depth]);
$obj = $mapper::getInitializedArray($mapper, $result[$mapper::$primaryField . '_' . $depth]);
return $obj ?? $mapper::populateAbstractArray($result, [], $depth);
}
@ -1941,7 +1941,7 @@ class DataMapperAbstract implements DataMapperInterface
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);
}
@ -1995,7 +1995,7 @@ class DataMapperAbstract implements DataMapperInterface
foreach (static::$columns as $column => $def) {
$alias = $column . '_' . $depth;
if (!isset($result[$alias])) {
if (!\array_key_exists($alias, $result)) {
continue;
}
@ -2078,7 +2078,7 @@ class DataMapperAbstract implements DataMapperInterface
$column = $def['mapper']::getColumnByMember($member);
$alias = $column . '_' . ($depth - 1);
if (!isset($result[$alias]) || !isset($def['column'])) {
if (!\array_key_exists($alias, $result) || !isset($def['column'])) {
continue;
}
@ -2153,11 +2153,15 @@ class DataMapperAbstract implements DataMapperInterface
*/
public static function populateAbstractArray(array $result, array $obj = [], int $depth = 3) : array
{
foreach ($result as $column => $value) {
if (!isset(static::$columns[$column]['internal'])) {
foreach (static::$columns as $column => $def) {
$alias = $column . '_' . $depth;
if (!\array_key_exists($alias, $result)) {
continue;
}
$value = $result[$alias];
$path = static::$columns[$column]['internal'];
if (\stripos($path, '/') !== false) {
$path = \explode('/', $path);
@ -2166,9 +2170,17 @@ class DataMapperAbstract implements DataMapperInterface
$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);
} 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);
} elseif (\in_array(static::$columns[$column]['type'], ['string', 'int', 'float', 'bool'])) {
\settype($value, static::$columns[$column]['type']);
@ -2181,6 +2193,28 @@ class DataMapperAbstract implements DataMapperInterface
$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;
}
@ -2338,25 +2372,15 @@ class DataMapperAbstract implements DataMapperInterface
unset($keys[$key]);
}
if (empty($keys) && $primaryKey !== null) {
$countResulsts = \count($obj);
if (!empty($keys) || $primaryKey === null) {
$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) {
return self::createNullModel();
} elseif ($countResulsts === 1) {
return \reset($obj);
$obj[$value] = self::populateAbstract($row, $obj[$value], $depth);
}
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);
@ -2514,6 +2538,12 @@ class DataMapperAbstract implements DataMapperInterface
{
$result = self::get(null, $relations, $depth);
if (\is_object($result)) {
if (\stripos(\get_class($result), '\Null') !== false) {
return [];
}
}
return !\is_array($result) ? [$result] : $result;
}
@ -2531,7 +2561,7 @@ class DataMapperAbstract implements DataMapperInterface
{
$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);
if (\is_object($result)) {
if (\stripos(\get_class($result), '\Null') !== false) {
return [];
}
}
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
*

View File

@ -555,7 +555,7 @@ class Builder extends BuilderAbstract
$i = 0;
foreach ($columns as $column) {
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)][] = [

View File

@ -75,7 +75,7 @@ class MysqlGrammar extends Grammar
$builder->select('*')
->from('information_schema.columns')
->where('table_schema', '=', $query->getConnection()->getDatabase())
->andWhere('table_name', '=' . $table);
->andWhere('table_name', '=', $table);
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);
$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());
}
@ -250,7 +254,10 @@ class DataMapperAbstractTest extends \PHPUnit\Framework\TestCase
self::assertEquals($this->modelArray['belongsToOne']['string'], $modelR['belongsToOne']['string']);
$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());
}

View File

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

View File

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