/**
  * @param string $path
  * @return mixed
  * @throws ResourceValidationException
  */
 public function validate(string $path = '')
 {
     $messages = new MessageCollection();
     foreach ($this->getResourceDefinition()->getFields() as $field) {
         /** @var ResourceField $field */
         $value = $this->properties->getProperty($field);
         try {
             if (!isset($value)) {
                 $field->validate(null, $path);
             } else {
                 $value->validate($path);
             }
         } catch (PropertyValidationException $e) {
             $messages->merge($e->getMessages());
         }
     }
     // Also check all resource wide requirements
     try {
         $this->getResourceDefinition()->getValidators()->validate($this);
     } catch (ResourceValidationException $e) {
         $messages->merge($e->getMessages());
     }
     if (count($messages) > 0) {
         throw ResourceValidationException::make($messages);
     }
 }
 /**
  * @param ResourceTransformer $transformer
  * @param RelationshipField $field
  * @param mixed $parentEntity
  * @param PropertyValues $identifiers
  * @param Context $context
  * @return mixed
  */
 public function getChildByIdentifiers(ResourceTransformer $transformer, RelationshipField $field, $parentEntity, PropertyValues $identifiers, Context $context)
 {
     $entities = $this->resolveProperty($transformer, $parentEntity, $field, $context);
     if ($entities instanceof Relation) {
         // Clone to avoid setting multiple filters
         $entities = clone $entities;
         foreach ($identifiers->toMap() as $k => $v) {
             $entities->where($k, $v);
         }
         $entity = $entities->get()->first();
         if (!$entity) {
             return null;
         }
         return $entity;
     }
     foreach ($entities as $entity) {
         if ($this->entityEquals($transformer, $entity, $identifiers, $context)) {
             return $entity;
         }
     }
 }
 /**
  * @param ResourceTransformer $transformer
  * @param $original
  * @param PropertyValues $identifiers
  * @param Context $context
  * @return bool
  */
 protected function entityEquals(ResourceTransformer $transformer, $original, PropertyValues $identifiers, Context $context)
 {
     if (count($identifiers->getValues()) === 0) {
         return false;
     }
     foreach ($identifiers->getValues() as $identifier) {
         $path = $this->splitPathParameters($identifier->getField()->getName());
         $propertyValue = $this->resolveChildPath($transformer, $original, $path, $identifier->getField(), $context);
         if (!$identifier->equals($propertyValue)) {
             return false;
         }
     }
     return true;
 }