mirror of
https://github.com/Karaka-Management/phpOMS.git
synced 2026-02-10 22:18:40 +00:00
add indirect relations
This commit is contained in:
parent
3226150ee5
commit
930f7c8e86
|
|
@ -688,7 +688,7 @@ class DataMapperAbstract implements DataMapperInterface
|
||||||
public static function getObjectId(object $obj, \ReflectionClass $refClass = null, string $member = null) : mixed
|
public static function getObjectId(object $obj, \ReflectionClass $refClass = null, string $member = null) : mixed
|
||||||
{
|
{
|
||||||
$refClass ??= new \ReflectionClass($obj);
|
$refClass ??= new \ReflectionClass($obj);
|
||||||
$propertyName = static::$columns[$member ?? static::$primaryField]['internal'];
|
$propertyName = $member ?? static::$columns[static::$primaryField]['internal'];
|
||||||
$refProp = $refClass->getProperty($propertyName);
|
$refProp = $refClass->getProperty($propertyName);
|
||||||
|
|
||||||
if (!$refProp->isPublic()) {
|
if (!$refProp->isPublic()) {
|
||||||
|
|
@ -1006,9 +1006,31 @@ class DataMapperAbstract implements DataMapperInterface
|
||||||
return $obj;
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var self $mapper */
|
$mapper = '';
|
||||||
$mapper = static::$belongsTo[$propertyName]['mapper'];
|
$primaryKey = 0;
|
||||||
$primaryKey = $mapper::getObjectId($obj, member: static::$belongsTo[$propertyName]['by'] ?? null);
|
|
||||||
|
if (isset(static::$belongsTo[$propertyName]['by'])) {
|
||||||
|
// has by (obj is stored as a different model e.g. model = profile but reference/db is account)
|
||||||
|
|
||||||
|
$refClass = new \ReflectionClass($obj);
|
||||||
|
$refProp = $refClass->getProperty(static::$belongsTo[$propertyName]['by']);
|
||||||
|
|
||||||
|
if (!$refProp->isPublic()) {
|
||||||
|
$refProp->setAccessible(true);
|
||||||
|
$obj = $refProp->getValue($obj);
|
||||||
|
$refProp->setAccessible(false);
|
||||||
|
} else {
|
||||||
|
$obj = $obj->{static::$belongsTo[$propertyName]['by']};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var self $mapper */
|
||||||
|
$mapper = static::$belongsTo[$propertyName]['mapper']::getBelongsTo(static::$belongsTo[$propertyName]['by'])['mapper'];
|
||||||
|
$primaryKey = $mapper::getObjectId($obj);
|
||||||
|
} else {
|
||||||
|
/** @var self $mapper */
|
||||||
|
$mapper = static::$belongsTo[$propertyName]['mapper'];
|
||||||
|
$primaryKey = $mapper::getObjectId($obj);
|
||||||
|
}
|
||||||
|
|
||||||
// @todo: the $mapper::create() might cause a problem is 'by' is set. because we don't want to create this obj but the child obj.
|
// @todo: the $mapper::create() might cause a problem is 'by' is set. because we don't want to create this obj but the child obj.
|
||||||
return empty($primaryKey) ? $mapper::create($obj) : $primaryKey;
|
return empty($primaryKey) ? $mapper::create($obj) : $primaryKey;
|
||||||
|
|
@ -2337,7 +2359,12 @@ class DataMapperAbstract implements DataMapperInterface
|
||||||
$refProp->setValue($obj, \json_decode($value, true));
|
$refProp->setValue($obj, \json_decode($value, true));
|
||||||
} elseif ($def['type'] === 'Serializable') {
|
} elseif ($def['type'] === 'Serializable') {
|
||||||
$member = $isPublic ? $obj->{$def['internal']} : $refProp->getValue($obj);
|
$member = $isPublic ? $obj->{$def['internal']} : $refProp->getValue($obj);
|
||||||
$member->unserialize($value);
|
|
||||||
|
if ($value === null) {
|
||||||
|
$obj->{$def['internal']} = $value;
|
||||||
|
} else {
|
||||||
|
$member->unserialize($value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$isPublic) {
|
if (!$isPublic) {
|
||||||
|
|
@ -2583,6 +2610,8 @@ class DataMapperAbstract implements DataMapperInterface
|
||||||
->orderBy(static::$table . '_' . $depth . '.' . ($column !== null ? self::getColumnByMember($column) : static::$primaryField), $order)
|
->orderBy(static::$table . '_' . $depth . '.' . ($column !== null ? self::getColumnByMember($column) : static::$primaryField), $order)
|
||||||
->limit($limit);
|
->limit($limit);
|
||||||
|
|
||||||
|
$q = $query->toSql();
|
||||||
|
|
||||||
return self::getAllByQuery($query, $relations, $depth);
|
return self::getAllByQuery($query, $relations, $depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3573,6 +3602,20 @@ class DataMapperAbstract implements DataMapperInterface
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get belongsTo definitions
|
||||||
|
*
|
||||||
|
* @param string $name member name
|
||||||
|
*
|
||||||
|
* @return null|array
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public static function getBelongsTo(string $name) : ?array
|
||||||
|
{
|
||||||
|
return static::$belongsTo[$name] ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test if object is null object
|
* Test if object is null object
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user