Skip to content

Commit

Permalink
Fix: correct handling of many to many relations
Browse files Browse the repository at this point in the history
  • Loading branch information
gluafamichl committed Oct 25, 2024
1 parent ca875e0 commit 47363a8
Showing 1 changed file with 18 additions and 20 deletions.
38 changes: 18 additions & 20 deletions src/inc/apiv2/common/AbstractModelAPI.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
use DBA\JoinFilter;
use DBA\Factory;
use DBA\ContainFilter;
use DBA\OrderFilter;
use DBA\QueryFilter;
use Middlewares\Utils\HttpErrorException;


Expand Down Expand Up @@ -127,7 +125,7 @@ final protected static function getManyToOneRelation(
* @param array $objects Objects Fetch relation for selected Objects
* @param string $objectField Field to use as base for $objects
* @param object $intermediateFactory Factory used as intermediate between parentObject and targetObject
* @param string $filterField Filter field of intermadiateObject to filter against $objects field
* @param string $filterField Filter field of intermediateObject to filter against $objects field
* @param object $targetFactory Object properties of objects returned
* @param string $joinField Field to connect 'intermediate' to 'target'
Expand All @@ -139,12 +137,11 @@ final protected static function getManyToOneRelationViaIntermediate(
object $intermediateFactory,
string $filterField,
object $targetFactory,
string $joinField,
string $joinField
): array {
assert($intermediateFactory instanceof AbstractModelFactory);
assert($targetFactory instanceof AbstractModelFactory);
$retval = array();

$many2Many = array();

/* Retrieve Parent -> Intermediate -> Target objects */
$objectIds = [];
Expand All @@ -156,20 +153,21 @@ final protected static function getManyToOneRelationViaIntermediate(
$jF = new JoinFilter($intermediateFactory, $joinField, $joinField);
$hO = $targetFactory->filter([Factory::FILTER => $qF, Factory::JOIN => $jF]);

/* Build mapping Parent -> Intermediate */
$i2p = [];
foreach($hO[$intermediateFactory->getModelName()] as $intermidiateObject) {
$kv = $intermidiateObject->getKeyValueDict();
$i2p[$kv[$joinField]] = $kv[$filterField];
}

/* Associate Target -> Parent (via Intermediate) */
foreach($hO[$targetFactory->getModelName()] as $targetObject) {
$parent = $i2p[$targetObject->getKeyValueDict()[$joinField]];
$retval[$parent][] = $targetObject;
$intermediateObjectList = $hO[$intermediateFactory->getModelName()];
$targetObjectList = $hO[$targetFactory->getModelName()];

$intermediateObject = current($intermediateObjectList);
$targetObject = current($targetObjectList);

while ($intermediateObject && $targetObject) {
$kv = $intermediateObject->getKeyValueDict();
$many2Many[$kv[$filterField]][] = $targetObject;

$intermediateObject = next($intermediateObjectList);
$targetObject = next($targetObjectList);
}

return $retval;
return $many2Many;
}

/**
Expand Down Expand Up @@ -216,7 +214,7 @@ public function deleteOne(Request $request, Response $response, array $args): Re


/**
* Request single object from database & validate permissons
* Request single object from database & validate permissions
*/
protected function doFetch(Request $request, string $pk): mixed
{
Expand Down

0 comments on commit 47363a8

Please sign in to comment.