diff --git a/src/Annotation/Classes/Table.php b/src/Annotation/Classes/Table.php index 659dd15..2f881ea 100644 --- a/src/Annotation/Classes/Table.php +++ b/src/Annotation/Classes/Table.php @@ -8,6 +8,8 @@ class Table implements \Ulmus\Annotation\Annotation { public string $schema; + public string $adapter; + public function __construct($name = null) { if ( $name !== null ) { diff --git a/src/Common/EntityResolver.php b/src/Common/EntityResolver.php index c08f9ce..e006602 100644 --- a/src/Common/EntityResolver.php +++ b/src/Common/EntityResolver.php @@ -136,6 +136,23 @@ class EntityResolver { return $table->name; } + public function databaseAdapter() : ? \Ulmus\ConnectionAdapter + { + if ( null !== $table = $this->getAnnotationFromClassname( Table::class ) ) { + if ( $table->adapter ?? null ) { + if ( null === ( $adapter = \Ulmus\Ulmus::$registeredAdapters[$table->adapter] ?? null ) ) { + throw new \Exception("Requested database adapter ( {$table->adapter} ) is not registered."); + } + else { + return $adapter; + } + } + } + + return null; + } + + public function schemaName() : ? string { if ( null === $table = $this->getAnnotationFromClassname( Table::class ) ) { @@ -150,10 +167,10 @@ class EntityResolver { } public function getPrimaryKeyField() : ? array - { + { foreach($this->fieldList() as $key => $value) { if ( null !== ( $field = $this->searchFieldAnnotation($key, new Field() ) ) ) { - if (false !== $field->attributes['primary_key'] ?? false ) { + if ( false !== ( $field->attributes['primary_key'] ?? false ) ) { return [ $key => $field ]; } } diff --git a/src/ConnectionAdapter.php b/src/ConnectionAdapter.php index fd7d804..83235a6 100644 --- a/src/ConnectionAdapter.php +++ b/src/ConnectionAdapter.php @@ -16,15 +16,13 @@ class ConnectionAdapter public PdoObject $pdo; - public function __construct(string $name = "default", array $configuration = []) + public function __construct(string $name = "default", array $configuration = [], bool $default = false) { $this->name = $name; $this->configuration = $configuration; - if ( $name === "default" ) { - Ulmus::$defaultAdapter = $this; - } + Ulmus::registerAdapter($this, $default); } public function resolveConfiguration() : void diff --git a/src/EntityTrait.php b/src/EntityTrait.php index b842cc9..d68b20a 100644 --- a/src/EntityTrait.php +++ b/src/EntityTrait.php @@ -204,7 +204,7 @@ trait EntityTrait { */ public static function repository(string $alias = Repository::DEFAULT_ALIAS) : Repository { - return Ulmus::repository(static::class, $alias, Ulmus::$defaultAdapter); + return Ulmus::repository(static::class, $alias); } /** diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php index 89efd76..0b271a1 100644 --- a/src/QueryBuilder.php +++ b/src/QueryBuilder.php @@ -117,7 +117,7 @@ class QueryBuilder public function from(string $table, ? string $alias = null, ? string $database = null, ? string $schema = null) : self { if ( $database ) { - $table = "\"$database\".$table"; + $table = "$database.$table"; } if ( $schema ) { diff --git a/src/Repository.php b/src/Repository.php index a124993..9975b94 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -21,9 +21,9 @@ class Repository public function __construct(string $entity, string $alias = self::DEFAULT_ALIAS, ConnectionAdapter $adapter = null) { $this->entityClass = $entity; $this->alias = $alias; - $this->adapter = $adapter ?: Ulmus::$defaultAdapter; - $this->queryBuilder = new QueryBuilder( $this->adapter->adapter() ); $this->entityResolver = Ulmus::resolveEntity($entity); + $this->adapter = $adapter ?? $this->entityResolver->databaseAdapter() ?? Ulmus::$defaultAdapter; + $this->queryBuilder = new QueryBuilder( $this->adapter->adapter() ); } public function loadOne() : ? object @@ -52,7 +52,7 @@ class Repository $this->finalizeQuery(); - foreach(Ulmus::iterateQueryBuilder($this->queryBuilder) as $entityData) { + foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) { return $entityData['totalItem']; } @@ -106,8 +106,6 @@ class Repository $diff = array_diff_assoc($dataset, $entity->entityGetDataset(true)); - var_dump( "
", $diff, $dataset, $entity->entityGetDataset(true) );
-            
             if ( [] !== $diff ) {
                 $update = $this->updateSqlQuery($diff)->runQuery();
                 
@@ -174,7 +172,7 @@ class Repository
 
     public function from(string $table, ? string $alias, ? string $schema) : self
     {
-        $this->queryBuilder->from($table, $alias, null, $schema);
+        $this->queryBuilder->from($table, $alias, $this->adapter->adapter()->database, $schema);
         
         return $this;
     }
@@ -365,7 +363,7 @@ class Repository
         
         $this->finalizeQuery();
 
-        foreach(Ulmus::iterateQueryBuilder($this->queryBuilder) as $entityData) {
+        foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
             $entityCollection->append( ( new $class() )->entityFillFromDataset($entityData) );
         }
 
@@ -376,7 +374,7 @@ class Repository
     {
         $this->finalizeQuery();
         
-        return Ulmus::runQuery($this->queryBuilder);
+        return Ulmus::runQuery($this->queryBuilder, $this->adapter);
     }
     
     protected function insertSqlQuery(array $dataset) : self
diff --git a/src/Ulmus.php b/src/Ulmus.php
index f80b4fe..d97bd9a 100644
--- a/src/Ulmus.php
+++ b/src/Ulmus.php
@@ -10,13 +10,15 @@ abstract class Ulmus
 
     public static string $queryBuilderClass = "\\Ulmus\\QueryBuilder";
 
+    public static array $registeredAdapters = [];
+    
     public static ConnectionAdapter $defaultAdapter;
-
+    
     public static Entity\ObjectInstanciator $objectInstanciator;
     
     public static array $resolved = [];
 
-    public static function iterateQueryBuilder(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null) : Generator
+    public static function iterateQueryBuilder(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null) : Generator
     {
         $sql = $queryBuilder->render();
         $statement = ( $adapter ?: static::$defaultAdapter )->pdo->select($sql, $queryBuilder->parameters ?? []);
@@ -32,12 +34,12 @@ abstract class Ulmus
         ];
     }
     
-    public static function pdo(?ConnectionAdapter $adapter = null) : Common\PdoObject
+    public static function pdo(? ConnectionAdapter $adapter = null) : Common\PdoObject
     {
         return ( $adapter ?: static::$defaultAdapter )->pdo;
     }
     
-    public static function runQuery(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null)
+    public static function runQuery(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null)
     {
         return static::pdo($adapter)->runQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
     }
@@ -67,7 +69,16 @@ abstract class Ulmus
         return ( static::$objectInstanciator ?? static::$objectInstanciator = new Entity\ObjectInstanciator() )->convert($obj);
     }
     
-    protected static function fetchQueryBuilder(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null) : array
+    public static function registerAdapter(ConnectionAdapter $adapter, bool $default = false) : void
+    {
+        if ($default) {
+            static::$defaultAdapter = $adapter;
+        }
+        
+        static::$registeredAdapters[$adapter->name] = $adapter;
+    }
+    
+    protected static function fetchQueryBuilder(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null) : array
     {
         return ( $adapter ?: static::$defaultAdapter )->pdo->select($queryBuilder->render(), $queryBuilder->parameters ?? [])->fetchAll();
     }