@@ -94,6 +94,12 @@ protected static function addToRelationshipsArray(
9494 foreach ($ value as $ propertyName => $ attribute ) {
9595 if (PropertyHelper::isAttributeProperty ($ mappings , $ propertyName , $ type )) {
9696 $ propertyName = DataAttributesHelper::transformToValidMemberName ($ propertyName );
97+ if (\array_key_exists (Serializer::MAP_TYPE , $ attribute )
98+ && count (array_values ($ attribute [Serializer::SCALAR_VALUE ])) > 0
99+ && \array_key_exists (Serializer::CLASS_IDENTIFIER_KEY , array_values ($ attribute [Serializer::SCALAR_VALUE ])[0 ])) {
100+ self ::setResponseDataIncluded ($ mappings , $ value , $ data );
101+ continue ;
102+ }
97103
98104 if (\array_key_exists (Serializer::CLASS_IDENTIFIER_KEY , $ attribute )) {
99105 self ::setResponseDataIncluded ($ mappings , $ value , $ data );
@@ -155,17 +161,43 @@ protected static function addToIncludedArray(array &$mappings, array &$data, arr
155161 $ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] = $ relationships ;
156162 }
157163
158- $ data [JsonApiTransformer::INCLUDED_KEY ][] = \array_filter ($ arrayData );
164+ $ existingIndex = false ;
165+ if (array_key_exists (JsonApiTransformer::INCLUDED_KEY , $ data )) {
166+ $ existingIndex = self ::findIncludedIndex ($ data [JsonApiTransformer::INCLUDED_KEY ], $ arrayData [JsonApiTransformer::ID_KEY ], $ arrayData [JsonApiTransformer::TYPE_KEY ]);
167+ }
168+ if ($ existingIndex !== false ) {
169+ $ data [JsonApiTransformer::INCLUDED_KEY ][$ existingIndex ] = \array_filter (\array_merge ($ data [JsonApiTransformer::INCLUDED_KEY ][$ existingIndex ],
170+ \array_filter ($ arrayData , self ::filterEmptyArray ())), self ::filterEmptyArray ());
171+ } else {
172+ $ data [JsonApiTransformer::INCLUDED_KEY ][] = \array_filter ($ arrayData , self ::filterEmptyArray ());
173+ }
159174 }
160175 }
161-
162176 if (!empty ($ data [JsonApiTransformer::INCLUDED_KEY ])) {
163177 $ data [JsonApiTransformer::INCLUDED_KEY ] = \array_values (
164178 \array_unique ($ data [JsonApiTransformer::INCLUDED_KEY ], SORT_REGULAR )
165179 );
166180 }
167181 }
168182
183+ protected static function filterEmptyArray ()
184+ {
185+ return function ($ value ) {
186+ return $ value !== null && (!is_array ($ value ) || count ($ value ) > 0 );
187+ };
188+ }
189+
190+ protected static function findIncludedIndex ($ includedData , $ idNeedle , $ typeNeedle )
191+ {
192+ foreach ($ includedData as $ key => $ value ) {
193+ if ($ value [JsonApiTransformer::ID_KEY ] === $ idNeedle && $ value [JsonApiTransformer::TYPE_KEY ] === $ typeNeedle ) {
194+ return $ key ;
195+ }
196+ }
197+
198+ return false ;
199+ }
200+
169201 /**
170202 * @param array $includedData
171203 *
@@ -201,34 +233,43 @@ protected static function addRelationshipsToIncludedResources(
201233
202234 continue ;
203235 }
236+
237+ if (\is_array ($ attribute ) && \array_key_exists (Serializer::MAP_TYPE , $ attribute )) {
238+ $ relations = [];
239+ $ elements = $ attribute [Serializer::SCALAR_VALUE ];
240+ foreach ($ elements as $ arrayValue ) {
241+ if (\array_key_exists (Serializer::CLASS_IDENTIFIER_KEY , $ arrayValue )) {
242+ $ relations [] = PropertyHelper::setResponseDataTypeAndId ($ mappings , $ arrayValue );
243+ }
244+ }
245+ if (count ($ relations ) > 0 ) {
246+ $ data [DataLinksHelper::camelCaseToUnderscore ($ propertyName )][JsonApiTransformer::DATA_KEY ] = $ relations ;
247+ }
248+ continue ;
249+ }
204250 }
205251 }
206252 }
207253
208254 /**
209255 * Enforce with this check that each property leads to a data element.
210256 *
211- * @param array $value
212257 * @param array $arrayData
213258 *
214259 * @return array
215260 */
216261 protected static function normalizeRelationshipData (array &$ value , array $ arrayData )
217262 {
218263 $ relationships = [];
219- foreach ($ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] as $ attribute => $ value ) {
264+ foreach ($ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] as $ attribute => $ attributeValue ) {
220265 //if $value[data] is not found, get next level where [data] should exist.
221- if (!array_key_exists (JsonApiTransformer::DATA_KEY , $ value )) {
222- array_shift ($ value );
266+ if (!array_key_exists (JsonApiTransformer::DATA_KEY , $ attributeValue )) {
267+ array_shift ($ attributeValue );
223268 }
224269
225- //If one value in $value[data], remove the array and make it object only.
226- if (1 === count ($ value [JsonApiTransformer::DATA_KEY ])) {
227- $ value = reset ($ value [JsonApiTransformer::DATA_KEY ]);
228- }
229270
230- if (count ($ value [JsonApiTransformer::DATA_KEY ]) > 0 ) {
231- $ relationships [$ attribute ] = $ value ;
271+ if (count ($ attributeValue [JsonApiTransformer::DATA_KEY ]) > 0 ) {
272+ $ relationships [$ attribute ] = $ attributeValue ;
232273 }
233274 }
234275
0 commit comments