/**
  * @param ResourceTransformer $transformer
  * @param ResourceCollection $collection
  * @param ResourceDefinition $definition
  * @param Context $context
  * @param RelationshipValue $parent
  * @param null $parentEntity
  */
 public function processCollection(ResourceTransformer $transformer, ResourceCollection $collection, ResourceDefinition $definition, Context $context, RelationshipValue $parent = null, $parentEntity = null)
 {
     $builder = $this->getPaginationBuilderFromDefinition($transformer, $definition, null, null);
     if (count($collection) > 0 && (!isset($parent) || $parent->getField()->getRecords() > 0)) {
         // Register all identifiers if parent is present
         if ($parent) {
             foreach ($definition->getFields()->getIdentifiers() as $field) {
                 $builder->registerPropertyName($field->getName(), $field->getDisplayName());
             }
         }
         /** @var RESTResource $first */
         $first = $collection->first();
         if ($first) {
             $builder->setFirst($this->transformResource($builder, $first));
         }
         /** @var RESTResource $first */
         $last = $collection->last();
         if ($last) {
             $builder->setLast($this->transformResource($builder, $last));
         }
         $cursor = $builder->getNavigation();
         if ($parent) {
             $url = $parent->getField()->getUrl();
         } elseif ($context->getUrl()) {
             $url = $context->getUrl();
         } else {
             $url = $definition->getUrl();
         }
         $url = $transformer->getPropertyResolver()->resolvePathParameters($transformer, $parentEntity, $url, $context);
         $collection->addMeta('pagination', ['next' => $cursor->getNext() ? $url . '?' . http_build_query($cursor->getNext()) : null, 'previous' => $cursor->getPrevious() ? $url . '?' . http_build_query($cursor->getPrevious()) : null, 'cursors' => $cursor->toArray()]);
     }
 }
 /**
  * @param ResourceTransformer $transformer
  * @param mixed $entity
  * @param RelationshipValue $value
  * @param Context $context
  * @return RESTResource
  * @throws InvalidPropertyException
  */
 public function resolveOneRelationship(ResourceTransformer $transformer, $entity, RelationshipValue $value, Context $context)
 {
     $field = $value->getField();
     $child = null;
     try {
         $child = $this->resolveProperty($transformer, $entity, $field, $context);
     } catch (InvalidPropertyException $e) {
         return null;
     }
     if ($child) {
         return $transformer->toResource($field->getChildResource(), $child, $context->getChildContext($field, $field->getExpandContext()), $value, $entity);
     }
 }
 /**
  * @param ResourceTransformer $transformer
  * @param mixed $entity
  * @param RelationshipValue $value
  * @param Context $context
  * @return ResourceCollection
  * @throws InvalidPropertyException
  */
 public function resolveManyRelationship(ResourceTransformer $transformer, $entity, RelationshipValue $value, Context $context) : ResourceCollection
 {
     $field = $value->getField();
     $models = $this->resolveProperty($transformer, $entity, $field, $context);
     if ($models instanceof Relation) {
         // Clone to avoid setting multiple filters
         $models = clone $models;
         if ($field->getRecords()) {
             $models->take($field->getRecords());
         }
         $models = $models->get();
     }
     return $transformer->toResources($field->getChildResource(), $models, $context->getChildContext($field, $field->getExpandContext()), $value, $entity);
 }