Skip to content

Commit 6297209

Browse files
authored
Fix: many to many relations from DB did not work (#1174)
Co-authored-by: gluafamichl <>
1 parent df3c233 commit 6297209

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

src/inc/apiv2/common/AbstractModelAPI.class.php

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -255,33 +255,32 @@ final protected static function getManyToOneRelationViaIntermediate(
255255
): array {
256256
assert($intermediateFactory instanceof AbstractModelFactory);
257257
assert($targetFactory instanceof AbstractModelFactory);
258-
$retval = array();
259-
260-
258+
$many2Many = array();
259+
261260
/* Retrieve Parent -> Intermediate -> Target objects */
262261
$objectIds = [];
263-
foreach ($objects as $object) {
262+
foreach($objects as $object) {
264263
$kv = $object->getKeyValueDict();
265264
$objectIds[] = $kv[$objectField];
266265
}
267266
$qF = new ContainFilter($filterField, $objectIds, $intermediateFactory);
268267
$jF = new JoinFilter($intermediateFactory, $joinField, $joinField);
269268
$hO = $targetFactory->filter([Factory::FILTER => $qF, Factory::JOIN => $jF]);
270-
271-
/* Build mapping Parent -> Intermediate */
272-
$i2p = [];
273-
foreach ($hO[$intermediateFactory->getModelName()] as $intermidiateObject) {
274-
$kv = $intermidiateObject->getKeyValueDict();
275-
$i2p[$kv[$joinField]] = $kv[$filterField];
269+
270+
$intermediateObjectList = $hO[$intermediateFactory->getModelName()];
271+
$targetObjectList = $hO[$targetFactory->getModelName()];
272+
273+
$intermediateObject = current($intermediateObjectList);
274+
$targetObject = current($targetObjectList);
275+
276+
while ($intermediateObject && $targetObject) {
277+
$kv = $intermediateObject->getKeyValueDict();
278+
$many2Many[$kv[$filterField]][] = $targetObject;
279+
280+
$intermediateObject = next($intermediateObjectList);
281+
$targetObject = next($targetObjectList);
276282
}
277-
278-
/* Associate Target -> Parent (via Intermediate) */
279-
foreach ($hO[$targetFactory->getModelName()] as $targetObject) {
280-
$parent = $i2p[$targetObject->getKeyValueDict()[$joinField]];
281-
$retval[$parent][] = $targetObject;
282-
}
283-
284-
return $retval;
283+
return $many2Many;
285284
}
286285

287286
/**

0 commit comments

Comments
 (0)