From 0bbf9fa473258aa79559e57b3fba73fa0bdf3396 Mon Sep 17 00:00:00 2001 From: Arlen Johnson Date: Mon, 31 Aug 2026 11:27:42 -0400 Subject: [PATCH] Fix subnavigation link building for self-referential models (CFM-545) --- app/src/Lib/Util/TableUtilities.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/Lib/Util/TableUtilities.php b/app/src/Lib/Util/TableUtilities.php index 02e8a6d62..0b90ebcf3 100644 --- a/app/src/Lib/Util/TableUtilities.php +++ b/app/src/Lib/Util/TableUtilities.php @@ -262,6 +262,14 @@ public static function treeTraversalFromPrimaryLink( // qualify the FK using the requester table we're currently traversing // but compare against the physical table name in the database. $fkQualifiedModel = StringUtilities::foreignKeyToQualifiedModelName($col, $primaryLinkModelName); + + // Don't re-enter a model already recorded (e.g. Groups.parent_id -> Groups.id) + // so that we don't clobber an entity's own ID with its parent's. + // We will only ever have one instance of a model in a subnavigation tab listing. + if (array_key_exists($fkQualifiedModel, $results)) { + continue; + } + $fkTargetTable = TableRegistry::getTableLocator()->get($fkQualifiedModel); $fk_table = $fkTargetTable->getTable(); @@ -326,6 +334,13 @@ public static function treeTraversalFromId(string $modelName, int $id, array &$r // qualify the FK using the requester table we're currently traversing // but compare against the physical table name in the database. $fkQualifiedModel = StringUtilities::foreignKeyToQualifiedModelName($col, $modelName); + + // Same guard as treeTraversalFromPrimaryKey — don't re-enter a model we've already recorded. + // We will only ever have one instance of a model in a subnavigation tab listing. + if (array_key_exists($fkQualifiedModel, $results)) { + continue; + } + $fkTargetTable = TableRegistry::getTableLocator()->get($fkQualifiedModel); $fk_table = $fkTargetTable->getTable();