From 1e4c42d4c98ec16ab91135b7ac69fb2c2f18a783 Mon Sep 17 00:00:00 2001 From: Erwan Le Poder Date: Wed, 2 Mar 2016 19:02:23 +0100 Subject: [PATCH] Fixing date retrieval for lazily loaded objects --- src/Mouf/Database/TDBM/DbRow.php | 10 ++++++- src/Mouf/Database/TDBM/TDBMService.php | 28 +++++++++++++++++++ .../Database/TDBM/TDBMDaoGeneratorTest.php | 11 ++++++++ tests/sql/tdbmunittest.sql | 11 ++++---- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/Mouf/Database/TDBM/DbRow.php b/src/Mouf/Database/TDBM/DbRow.php index 1c1d6d7..da1f2a5 100644 --- a/src/Mouf/Database/TDBM/DbRow.php +++ b/src/Mouf/Database/TDBM/DbRow.php @@ -169,7 +169,15 @@ public function _dbLoadIfNotLoaded() throw new TDBMException("Could not retrieve object from table \"$this->dbTableName\" using filter \"\"."); } - $this->dbRow = $result->fetch(\PDO::FETCH_ASSOC); + + $row = $result->fetch(\PDO::FETCH_ASSOC); + + $this->dbRow = []; + $types = $this->tdbmService->_getColumnTypesForTable($this->dbTableName); + + foreach ($row as $key => $value) { + $this->dbRow[$key] = $types[$key]->convertToPHPValue($value, $connection->getDatabasePlatform()); + } $result->closeCursor(); diff --git a/src/Mouf/Database/TDBM/TDBMService.php b/src/Mouf/Database/TDBM/TDBMService.php index d4db930..e486b85 100644 --- a/src/Mouf/Database/TDBM/TDBMService.php +++ b/src/Mouf/Database/TDBM/TDBMService.php @@ -27,6 +27,7 @@ use Doctrine\DBAL\Schema\ForeignKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Table; +use Doctrine\DBAL\Types\Type; use Mouf\Database\MagicQuery; use Mouf\Database\SchemaAnalyzer\SchemaAnalyzer; use Mouf\Database\TDBM\Utils\TDBMDaoGenerator; @@ -1315,6 +1316,7 @@ public function findObjectByPk($table, array $primaryKeys, array $additionalTabl $bean = $this->reflectionClassCache[$className]->newInstanceWithoutConstructor(); /* @var $bean AbstractTDBMObject */ $bean->_constructLazy($table, $primaryKeys, $this); + return $bean; } } @@ -1513,4 +1515,30 @@ public function _getPivotTablesLinkedToBean(AbstractTDBMObject $bean) return $junctionTables; } + + /** + * Array of types for tables. + * Key: table name + * Value: array of types indexed by column. + * + * @var array[] + */ + private $typesForTable = []; + + /** + * @internal + * @param string $tableName + * @return Type[] + */ + public function _getColumnTypesForTable($tableName) + { + if (!isset($typesForTable[$tableName])) { + $columns = $this->tdbmSchemaAnalyzer->getSchema()->getTable($tableName)->getColumns(); + $typesForTable[$tableName] = array_map(function(Column $column) { + return $column->getType(); + }, $columns); + + } + return $typesForTable[$tableName]; + } } diff --git a/tests/Mouf/Database/TDBM/TDBMDaoGeneratorTest.php b/tests/Mouf/Database/TDBM/TDBMDaoGeneratorTest.php index 1f5cb92..1cbc168 100644 --- a/tests/Mouf/Database/TDBM/TDBMDaoGeneratorTest.php +++ b/tests/Mouf/Database/TDBM/TDBMDaoGeneratorTest.php @@ -134,6 +134,17 @@ public function testGeneratedGetById() // FIXME: Question: que faire du paramètre stockage "UTC"???? } + /** + * @depends testDaoGeneration + */ + public function testGeneratedGetByIdLazyLoaded() + { + $roleDao = new RoleDao($this->tdbmService); + $roleBean = $roleDao->getById(1, true); + $this->assertEquals(1, $roleBean->getId()); + $this->assertInstanceOf('\\DateTimeInterface', $roleBean->getCreatedAt()); + } + /** * @depends testDaoGeneration */ diff --git a/tests/sql/tdbmunittest.sql b/tests/sql/tdbmunittest.sql index 4a9231f..365a26e 100644 --- a/tests/sql/tdbmunittest.sql +++ b/tests/sql/tdbmunittest.sql @@ -110,17 +110,18 @@ INSERT INTO `rights` (`label`) VALUES CREATE TABLE IF NOT EXISTS `roles` ( `id` int(11) NOT NULL, - `name` varchar(255) NOT NULL + `name` varchar(255) NOT NULL, + `created_at` date NULL ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- -- Dumping data for table `roles` -- -INSERT INTO `roles` (`id`, `name`) VALUES - (1, 'Admins'), - (2, 'Writers'), - (3, 'Singers'); +INSERT INTO `roles` (`id`, `name`, `created_at`) VALUES + (1, 'Admins', '2015-10-24'), + (2, 'Writers', '2015-10-24'), + (3, 'Singers', '2015-10-24'); -- --------------------------------------------------------