diff --git a/src/ItemHydrator.php b/src/ItemHydrator.php index 8f948c0..4089140 100644 --- a/src/ItemHydrator.php +++ b/src/ItemHydrator.php @@ -48,7 +48,7 @@ public function hydrate(ItemInterface $item, array $attributes): ItemInterface */ protected function fill(ItemInterface $item, array $attributes = null) { - $item->fill($attributes); + $item->fill(array_diff_key($attributes, array_combine($item->getAvailableRelations(), $item->getAvailableRelations()))); } /** diff --git a/src/Items/EloquentItem.php b/src/Items/EloquentItem.php index dacd280..203b60a 100644 --- a/src/Items/EloquentItem.php +++ b/src/Items/EloquentItem.php @@ -119,7 +119,7 @@ public function getAvailableRelations(): array * * @return \Swis\JsonApi\Collection */ - public function getIncluded() + public function getIncluded(): Collection { $included = new Collection(); @@ -128,12 +128,14 @@ public function getIncluded() if (!empty($relation->getType()) && null !== $relation->getId()) { $included->push($relation->toJsonApiArray()); } + $included = $included->merge($relation->getIncluded()); } elseif ($relation instanceof IlluminateCollection) { $relation->each( - function (ItemInterface $item) use ($included) { + function (ItemInterface $item) use (&$included) { if (!empty($item->getType()) && null !== $item->getId()) { $included->push($item->toJsonApiArray()); } + $included = $included->merge($item->getIncluded()); } ); } else { @@ -141,6 +143,10 @@ function (ItemInterface $item) use ($included) { } } - return $included; + return $included->unique( + function (array $item) { + return $item['type'].':'.$item['id']; + } + ); } } diff --git a/src/Items/JenssegersItem.php b/src/Items/JenssegersItem.php index 6cf5cb5..ae91eb2 100644 --- a/src/Items/JenssegersItem.php +++ b/src/Items/JenssegersItem.php @@ -183,7 +183,7 @@ public function getRelationships(): array * * @return \Swis\JsonApi\Collection */ - public function getIncluded() + public function getIncluded(): Collection { $included = new Collection(); @@ -192,17 +192,19 @@ public function getIncluded() continue; } - if ($relationship->getIncluded() instanceof ItemInterface) { - $item = $relationship->getIncluded(); - if (!empty($item->getType()) && null !== $item->getId()) { - $included->push($item->toJsonApiArray()); + $includedFromRelationship = $relationship->getIncluded(); + if ($includedFromRelationship instanceof ItemInterface) { + if (!empty($includedFromRelationship->getType()) && null !== $includedFromRelationship->getId()) { + $included->push($includedFromRelationship->toJsonApiArray()); } - } elseif ($relationship->getIncluded() instanceof Collection) { - $relationship->getIncluded()->each( - function (ItemInterface $item) use ($included) { + $included = $included->merge($includedFromRelationship->getIncluded()); + } elseif ($includedFromRelationship instanceof Collection) { + $includedFromRelationship->each( + function (ItemInterface $item) use (&$included) { if (!empty($item->getType()) && null !== $item->getId()) { $included->push($item->toJsonApiArray()); } + $included = $included->merge($item->getIncluded()); } ); } else { @@ -210,7 +212,11 @@ function (ItemInterface $item) use ($included) { } } - return $included; + return $included->unique( + function (array $item) { + return $item['type'].':'.$item['id']; + } + ); } /**