bugfix datamapper joins

This commit is contained in:
Dennis Eichhorn 2020-03-28 16:22:32 +01:00
parent 0d087399bc
commit 7300b52d25
2 changed files with 71 additions and 36 deletions

View File

@ -356,10 +356,10 @@ class DataMapperAbstract implements DataMapperInterface
}
if ($hasAutocompletes) {
$query->andWhere($where2);
$query->orWhere($where2);
}
if ($searchDepth > 1) {
if ($searchDepth > 2) {
foreach (static::$ownsOne as $one) {
$one['mapper']::findQuery($search, $searchDepth - 1, $query);
}
@ -1866,9 +1866,10 @@ class DataMapperAbstract implements DataMapperInterface
/**
* Populate data.
*
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param mixed $default Default value
*
* @return mixed
*
@ -1877,11 +1878,19 @@ class DataMapperAbstract implements DataMapperInterface
*
* @since 1.0.0
*/
public static function populateOwnsOne(string $member, array $result, int $depth = 3)
public static function populateOwnsOne(string $member, array $result, int $depth = 3, $default = null)
{
/** @var self $mapper */
$mapper = static::$ownsOne[$member]['mapper'];
if ($depth < 1) {
if (\array_key_exists(static::$ownsOne[$member]['self'] . '_' . ($depth + 1), $result)) {
return $mapper::createNullModel($result[static::$ownsOne[$member]['self'] . '_' . ($depth + 1)]);
} else {
return $default;
}
}
if (isset(static::$ownsOne[$member]['column'])) {
return $result[$mapper::getColumnByMember(static::$ownsOne[$member]['column']) . '_' . $depth];
}
@ -1898,19 +1907,28 @@ class DataMapperAbstract implements DataMapperInterface
/**
* Populate data.
*
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param mixed $default Default value
*
* @return void
*
* @since 1.0.0
*/
public static function populateOwnsOneArray(string $member, array $result, int $depth = 3) : array
public static function populateOwnsOneArray(string $member, array $result, int $depth = 3, $default = null) : array
{
/** @var self $mapper */
$mapper = static::$ownsOne[$member]['mapper'];
if ($depth < 1) {
if (\array_key_exists(static::$ownsOne[$member]['self'] . '_' . ($depth + 1), $result)) {
return $result[static::$ownsOne[$member]['self'] . '_' . ($depth + 1)];
} else {
return $default;
}
}
if (isset(static::$ownsOne[$member]['column'])) {
return $result[$mapper::getColumnByMember(static::$ownsOne[$member]['column']) . '_' . $depth];
}
@ -1927,9 +1945,10 @@ class DataMapperAbstract implements DataMapperInterface
/**
* Populate data.
*
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param mixed $default Default value
*
* @return mixed
*
@ -1937,11 +1956,19 @@ class DataMapperAbstract implements DataMapperInterface
*
* @since 1.0.0
*/
public static function populateBelongsTo(string $member, array $result, int $depth = 3)
public static function populateBelongsTo(string $member, array $result, int $depth = 3, $default = null)
{
/** @var self $mapper */
$mapper = static::$belongsTo[$member]['mapper'];
if ($depth < 1) {
if (\array_key_exists(static::$belongsTo[$member]['self'] . '_' . ($depth + 1), $result)) {
return $mapper::createNullModel($result[static::$belongsTo[$member]['self'] . '_' . ($depth + 1)]);
} else {
return $default;
}
}
if (isset(static::$belongsTo[$member]['column'])) {
return $result[$mapper::getColumnByMember(static::$belongsTo[$member]['column']) . '_' . $depth];
}
@ -1958,19 +1985,28 @@ class DataMapperAbstract implements DataMapperInterface
/**
* Populate data.
*
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param string $member Member name
* @param array $result Result data
* @param int $depth Relation depth
* @param mixed $default Default value
*
* @return void
*
* @since 1.0.0
*/
public static function populateBelongsToArray(string $member, array $result, int $depth = 3) : array
public static function populateBelongsToArray(string $member, array $result, int $depth = 3, $default = null) : array
{
/** @var self $mapper */
$mapper = static::$belongsTo[$member]['mapper'];
if ($depth < 1) {
if (\array_key_exists(static::$belongsTo[$member]['self'] . '_' . ($depth + 1), $result)) {
return $result[static::$belongsTo[$member]['self'] . '_' . ($depth + 1)];
} else {
return $default;
}
}
if (isset(static::$belongsTo[$member]['column'])) {
return $result[$mapper::getColumnByMember(static::$belongsTo[$member]['column']) . '_' . $depth];
}
@ -2035,19 +2071,21 @@ class DataMapperAbstract implements DataMapperInterface
}
if (isset(static::$ownsOne[$def['internal']])) {
$default = null;
if ($depth - 1 < 1) {
continue;
$default = $refProp->getValue($obj);
}
$value = self::populateOwnsOne($def['internal'], $result, $depth - 1);
$value = self::populateOwnsOne($def['internal'], $result, $depth - 1, $default);
$refProp->setValue($obj, $value);
} elseif (isset(static::$belongsTo[$def['internal']])) {
$default = null;
if ($depth - 1 < 1) {
continue;
$default = $refProp->getValue($obj);
}
$value = self::populateBelongsTo($def['internal'], $result, $depth - 1);
$value = self::populateBelongsTo($def['internal'], $result, $depth - 1, $default);
$refProp->setValue($obj, $value);
} elseif (\in_array($def['type'], ['string', 'int', 'float', 'bool'])) {
@ -2180,16 +2218,8 @@ class DataMapperAbstract implements DataMapperInterface
}
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[$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']);
@ -2373,7 +2403,7 @@ class DataMapperAbstract implements DataMapperInterface
$obj = [];
foreach ($keys as $key => $value) {
if (!self::isInitialized(static::class, $value)) {
if (!self::isInitialized(static::class, $value) || $ref !== null) {
continue;
}
@ -2792,10 +2822,15 @@ class DataMapperAbstract implements DataMapperInterface
}
}
$sth = self::$db->con->prepare($query->toSql());
$sth->execute();
$results = $sth->fetchAll(\PDO::FETCH_ASSOC);
try {
$sth = self::$db->con->prepare($query->toSql());
$sth->execute();
$results = $sth->fetchAll(\PDO::FETCH_ASSOC);
} catch (\Throwable $t) {
$results = false;
\var_dump($query->toSql());
\var_dump($t->getMessage());
}
return $results === false ? [] : $results;
}

View File

@ -221,7 +221,7 @@ class DataMapperAbstractTest extends \PHPUnit\Framework\TestCase
self::assertEquals(
\reset($this->model->hasManyDirect)->string,
$for->string
$for[1]->string
);
self::assertCount(1, BaseModelMapper::getAll());