Example #1
0
 /**
  * Convert model to plain old php object.
  *
  * @param \ProAI\Datamapper\Contracts\Entity $entity
  * @return \ProAI\Datamapper\Eloquent\Model
  */
 public static function newFromEntity(EntityContract $entity)
 {
     // directly get private properties if entity extends the datamapper entity class (fast!)
     if ($entity instanceof \ProAI\Datamapper\Support\Entity) {
         return $entity->toEloquentModel();
     }
     // get private properties via reflection (slow!)
     $class = get_mapped_model(get_class($entity));
     $eloquentModel = new $class();
     $reflectionObject = new ReflectionObject($entity);
     $mapping = $eloquentModel->getMapping();
     // attributes
     foreach ($mapping['attributes'] as $attribute => $column) {
         if (!$eloquentModel->isGeneratedDate($column)) {
             $eloquentModel->setAttribute($column, $eloquentModel->getProperty($reflectionObject, $entity, $attribute));
         }
     }
     // embeddeds
     foreach ($mapping['embeddeds'] as $name => $embedded) {
         $embeddedObject = $eloquentModel->getProperty($reflectionObject, $entity, $name);
         if (!empty($embeddedObject)) {
             $embeddedReflectionObject = new ReflectionObject($embeddedObject);
             foreach ($embedded['attributes'] as $attribute => $column) {
                 $eloquentModel->setAttribute($column, $eloquentModel->getProperty($embeddedReflectionObject, $embeddedObject, $attribute));
             }
         }
     }
     // relations
     foreach ($mapping['relations'] as $name => $relation) {
         $relationObject = $eloquentModel->getProperty($reflectionObject, $entity, $name);
         if (!empty($relationObject) && !$relationObject instanceof \ProAI\Datamapper\Contracts\Proxy) {
             $value = $relationObject instanceof \ProAI\Datamapper\Support\Collection ? Collection::newFromEntity($relationObject) : self::newFromEntity($relationObject);
             $eloquentModel->setRelation($name, $value);
         }
     }
     return $eloquentModel;
 }