@@ -31,37 +31,30 @@ public function resolve(array $target, array $relations): array
31
31
$ relationMap [$ relation ['uuid ' ]] = $ relation ;
32
32
}
33
33
34
- return $ this ->doResolve ($ target , $ relationMap , []);
34
+
35
+ // Resolve relations within the relation map first
36
+ $ this ->doResolve ($ relationMap , $ relationMap );
37
+
38
+ // Then resolve relations in the main target
39
+ $ this ->doResolve ($ target , $ relationMap );
40
+
41
+ return $ target ;
35
42
}
36
43
37
- private function doResolve (array $ target , array $ relationMap, array $ seen ): array
44
+ private function doResolve (array & $ target , array & $ relationMap ): void
38
45
{
39
- foreach ($ target as $ key => $ value ) {
46
+ foreach ($ target as $ key => & $ value ) {
40
47
if ('uuid ' === $ key ) {
41
48
continue ;
42
49
}
43
50
44
51
if (\is_string ($ value ) && isset ($ relationMap [$ value ])) {
45
- if (\in_array ($ value , $ seen , true )) {
46
- continue ;
47
- }
48
-
49
- $ seen [] = $ value ;
50
- $ target [$ key ] = $ this ->doResolve ($ relationMap [$ value ], $ relationMap , $ seen );
52
+ $ value = $ relationMap [$ value ];
51
53
} elseif (\is_array ($ value ) && isset ($ value ['id ' ], $ relationMap [$ value ['id ' ]])) {
52
- $ id = $ value ['id ' ];
53
-
54
- if (\in_array ($ id , $ seen , true )) {
55
- continue ;
56
- }
57
-
58
- $ seen [] = $ id ;
59
- $ target [$ key ] = $ this ->doResolve ($ relationMap [$ id ], $ relationMap , $ seen );
54
+ $ value = $ relationMap [$ value ['id ' ]];
60
55
} elseif (\is_array ($ value )) {
61
- $ target [ $ key ] = $ this ->doResolve ($ value , $ relationMap, $ seen );
56
+ $ this ->doResolve ($ value , $ relationMap );
62
57
}
63
58
}
64
-
65
- return $ target ;
66
59
}
67
60
}
0 commit comments