/** * Convert an instance to an eloquent model object. * * @param string $lastObjectId * @param \ProAI\Datamapper\Eloquent\Model $lastEloquentModel * @return \ProAI\Datamapper\Eloquent\Model */ public function toEloquentObject($lastObjectId, $lastEloquentModel) { $class = get_mapped_model(static::class); $eloquentModel = new $class(); // get model data $dict = ['mapping' => $eloquentModel->getMapping(), 'attributes' => $eloquentModel->getAttributes(), 'relations' => $eloquentModel->getRelations()]; // attributes foreach ($dict['mapping']['attributes'] as $attribute => $column) { if (!$eloquentModel->isAutomaticallyUpdatedDate($column)) { $eloquentModel->setAttribute($column, $this->{$attribute}); } } // embeddeds foreach ($dict['mapping']['embeddeds'] as $name => $embedded) { $embeddedObject = $this->{$name}; if (!empty($embeddedObject)) { $embeddedObject->toEloquentObject($eloquentModel, $name); } } // relations foreach ($dict['mapping']['relations'] as $name => $relation) { $relationObject = $this->{$name}; if (!empty($relationObject) && !$relationObject instanceof \ProAI\Datamapper\Contracts\Proxy) { // set relation if ($relationObject instanceof \ProAI\Datamapper\Support\Collection) { $value = EloquentCollection::newFromDatamapperObject($relationObject, $this, $eloquentModel); } elseif (spl_object_hash($relationObject) == $lastObjectId) { $value = $lastEloquentModel; } else { $value = EloquentModel::newFromDatamapperObject($relationObject, spl_object_hash($this), $eloquentModel); } $eloquentModel->setRelation($name, $value); } } return $eloquentModel; }
/** * 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; }