@@ -94,6 +94,12 @@ protected static function addToRelationshipsArray(
94
94
foreach ($ value as $ propertyName => $ attribute ) {
95
95
if (PropertyHelper::isAttributeProperty ($ mappings , $ propertyName , $ type )) {
96
96
$ 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
+ }
97
103
98
104
if (\array_key_exists (Serializer::CLASS_IDENTIFIER_KEY , $ attribute )) {
99
105
self ::setResponseDataIncluded ($ mappings , $ value , $ data );
@@ -155,17 +161,43 @@ protected static function addToIncludedArray(array &$mappings, array &$data, arr
155
161
$ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] = $ relationships ;
156
162
}
157
163
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
+ }
159
174
}
160
175
}
161
-
162
176
if (!empty ($ data [JsonApiTransformer::INCLUDED_KEY ])) {
163
177
$ data [JsonApiTransformer::INCLUDED_KEY ] = \array_values (
164
178
\array_unique ($ data [JsonApiTransformer::INCLUDED_KEY ], SORT_REGULAR )
165
179
);
166
180
}
167
181
}
168
182
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
+
169
201
/**
170
202
* @param array $includedData
171
203
*
@@ -201,34 +233,43 @@ protected static function addRelationshipsToIncludedResources(
201
233
202
234
continue ;
203
235
}
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
+ }
204
250
}
205
251
}
206
252
}
207
253
208
254
/**
209
255
* Enforce with this check that each property leads to a data element.
210
256
*
211
- * @param array $value
212
257
* @param array $arrayData
213
258
*
214
259
* @return array
215
260
*/
216
261
protected static function normalizeRelationshipData (array &$ value , array $ arrayData )
217
262
{
218
263
$ relationships = [];
219
- foreach ($ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] as $ attribute => $ value ) {
264
+ foreach ($ arrayData [JsonApiTransformer::RELATIONSHIPS_KEY ] as $ attribute => $ attributeValue ) {
220
265
//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 );
223
268
}
224
269
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
- }
229
270
230
- if (count ($ value [JsonApiTransformer::DATA_KEY ]) > 0 ) {
231
- $ relationships [$ attribute ] = $ value ;
271
+ if (count ($ attributeValue [JsonApiTransformer::DATA_KEY ]) > 0 ) {
272
+ $ relationships [$ attribute ] = $ attributeValue ;
232
273
}
233
274
}
234
275
0 commit comments