From d9fa51fa1825e4a50fb2867fda656fe85b4750a2 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Mon, 4 Dec 2023 12:36:06 -0500 Subject: [PATCH] - Still WIP on removing annotations --- src/Entity/Sqlite/Schema.php | 8 +++++--- src/Entity/Sqlite/Table.php | 7 ++++++- src/EntityTrait.php | 4 +++- src/Repository.php | 23 +++++++++++++---------- src/Repository/RelationBuilder.php | 2 +- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Entity/Sqlite/Schema.php b/src/Entity/Sqlite/Schema.php index 04122da..0d11f29 100644 --- a/src/Entity/Sqlite/Schema.php +++ b/src/Entity/Sqlite/Schema.php @@ -4,7 +4,7 @@ namespace Ulmus\Entity\Sqlite; use Ulmus\EntityCollection; use Ulmus\Query\{From, Select}; -use Ulmus\{Attribute\Obj\Table, Repository}; +use Ulmus\{Attribute\Obj\Table, Repository, Ulmus}; use Ulmus\Attribute\Property\{Field, Filter, FilterJoin, Relation, Join, Virtual, Where}; #[Table(name: "sqlite_master")] @@ -27,12 +27,14 @@ class Schema #[Field] public ? string $sql; - ##[Relation("oneToMany", key: "tableName", foreignKey: "tableName", entity: Column::class)] #[Virtual(method: "filterColumns")] public EntityCollection $columns; public function filterColumns() : EntityCollection { - return ( new Repository\SqliteRepository(Column::class) )->pragma('table_info', $this->tableName)->collectionFromQuery(); + $adapter = Ulmus::$registeredAdapters[$this->loadedFromAdapter]; + + return Column::repository(Repository\SqliteRepository::DEFAULT_ALIAS, $adapter) + ->pragma('table_info', $this->tableName)->collectionFromQuery(); } } \ No newline at end of file diff --git a/src/Entity/Sqlite/Table.php b/src/Entity/Sqlite/Table.php index 25b5470..259a94a 100644 --- a/src/Entity/Sqlite/Table.php +++ b/src/Entity/Sqlite/Table.php @@ -3,6 +3,7 @@ namespace Ulmus\Entity\Sqlite; use Ulmus\ConnectionAdapter; +use Ulmus\EntityCollection; use Ulmus\Repository; #[\Ulmus\Attribute\Obj\Table(name: "sqlite_master")] @@ -10,12 +11,16 @@ class Table extends Schema { public static function repository(string $alias = Repository::DEFAULT_ALIAS, ConnectionAdapter $adapter = null): Repository { - return new class(static::class, $alias, $adapter) extends Repository\SqliteRepository + $repository = new class(static::class, $alias, $adapter) extends Repository\SqliteRepository { public function finalizeQuery(): void { $this->select(Table::field('tableName'))->groupBy(Table::field('tableName')); } }; + + $repository->entityClass = static::class; + + return $repository; } } \ No newline at end of file diff --git a/src/EntityTrait.php b/src/EntityTrait.php index 9fde948..db86bc5 100644 --- a/src/EntityTrait.php +++ b/src/EntityTrait.php @@ -14,6 +14,9 @@ use Ulmus\{Common\EntityResolver, trait EntityTrait { use EventTrait; + #[Ignore] + public string $loadedFromAdapter; + #[Ignore] protected bool $entityStrictFieldsDeclaration = false; @@ -324,7 +327,6 @@ trait EntityTrait { #[Ignore] public static function field($name, null|string|false $alias = Repository::DEFAULT_ALIAS) : EntityField { - $default = ( $alias === false ? '' : Repository::DEFAULT_ALIAS ); # bw compatibility, to be deprecated return new EntityField(static::class, $name, $alias ? Ulmus::repository(static::class)->adapter->adapter()->escapeIdentifier($alias, Adapter\AdapterInterface::IDENTIFIER_FIELD) : $default, Ulmus::resolveEntity(static::class)); diff --git a/src/Repository.php b/src/Repository.php index 349e42e..56d11a7 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -372,14 +372,12 @@ class Repository public function yield() : \Generator { - $class = $this->entityClass; - $this->selectSqlQuery(); $this->finalizeQuery(); foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { - yield ( new $class() )->entityFillFromDataset($entityData); + yield $this->instanciateEntity()->entityFillFromDataset($entityData); } } @@ -698,7 +696,7 @@ class Repository } } - if ( ! in_array(WithOptionEnum::SkipJoinFilter, $options) ) { + if ( ! in_array(WithOptionEnum::SkipJoinFilter, $options) ) { foreach ($this->entityResolver->searchFieldAnnotationList($item, [Attribute\Property\FilterJoin::class, FilterJoin::class]) as $filter) { call_user_func_array([$this->entityClass, $filter->method], [$join, $item, true]); } @@ -862,14 +860,17 @@ class Repository public function collectionFromQuery(? string $entityClass = null) : EntityCollection { - $class = $entityClass ?? $this->entityClass; + $entityClass ??= $this->entityClass; - $entityCollection = $class::entityCollection(); + $entityCollection = $entityClass::entityCollection(); $this->finalizeQuery(); foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { - $entityCollection->append( ( new $class() )->resetVirtualProperties()->entityFillFromDataset($entityData) ); + $entity = $this->instanciateEntity($entityClass); + $entity->loadedFromAdapter = $this->adapter->name; + + $entityCollection->append( $entity->resetVirtualProperties()->entityFillFromDataset($entityData) ); } $this->eventExecute(Event\Repository\CollectionFromQueryInterface::class, $entityCollection); @@ -1042,9 +1043,11 @@ class Repository return $this->entityClass::entityCollection(...$arguments); } - public function instanciateEntity() : object + public function instanciateEntity(? string $entityClass = null) : object { - return new $this->entityClass(); + $entityClass ??= $this->entityClass; + + return new $entityClass; } public function hasFilters() : bool @@ -1053,7 +1056,7 @@ class Repository } protected function matchEntity(object $entity) { - return get_class($entity) === $this->entityClass; + return $entity::class === $this->entityClass; } protected function finalizeQuery() : void {} diff --git a/src/Repository/RelationBuilder.php b/src/Repository/RelationBuilder.php index 6dc8669..af322f8 100644 --- a/src/Repository/RelationBuilder.php +++ b/src/Repository/RelationBuilder.php @@ -89,7 +89,7 @@ class RelationBuilder } } catch(\Throwable $e) { - throw new $e(sprintf("An error occurred while calling method from your #[Virtual] attribute in entity '%s::%s'.", $this->entity::class, $name )); + throw new $e(sprintf("An error occurred while calling method from your #[Virtual] attribute in entity '%s::%s'. Caught '%s'", $this->entity::class, $name, $e->getMessage() )); } }