3 namespace DataAccess\DataMapper
;
5 use Domain\Entities\IDivineEntity
;
6 use DataAccess\DataMapper\IDataMapper
;
7 use DataAccess\Queries\IQueryBuilder
;
8 use DataAccess\DataMapper\Helpers\AbstractPopulationHelper
;
12 class DataMapper
implements IDataMapper
17 public function __construct($maps, $dbCredentials)
19 $credentials = include $dbCredentials;
20 //TODO: should probably do all this through a configuration object or something
21 $dsn = 'mysql:host=localhost;dbname=divinelegy;charset=utf8';
24 $options = array(PDO
::ATTR_EMULATE_PREPARES
=> false
,
25 PDO
::ATTR_ERRMODE
=> PDO
::ERRMODE_EXCEPTION
);
27 $this->_db
= new PDO($dsn, $credentials['user'], $credentials['pass'], $options);
28 $this->_maps
= include $maps;
31 public function map($entityName, IQueryBuilder
$queryBuilder)
33 $queryString = $queryBuilder->buildQuery();
35 $statement = $this->_db
->prepare(sprintf($queryString,
36 $this->_maps
[$entityName]['table']
39 $statement->execute();
40 $rows = $statement->fetchAll();
44 foreach($rows as $row)
46 $className = $this->_maps
[$entityName]['class']; //the entity to instantiate and return
47 $constructors = AbstractPopulationHelper
::getConstrutorArray($this->_maps
, $entityName, $row, $this->_db
);
49 if(count($constructors) == 0)
51 $class = new $className;
53 $r = new ReflectionClass($className);
54 $class = $r->newInstanceArgs($constructors);
57 $class->setId($row['id']);
58 $entities[$row['id']] = $class;
64 public function save(IDivineEntity
$entity)
66 $queries = AbstractPopulationHelper
::generateUpdateSaveQuery($this->_maps
, $entity, $entity->getId(), $this->_db
);
68 // if($queries['TYPE'] == AbstractPopulationHelper::QUERY_TYPE_CREATE)
70 unset($queries['TYPE']);
72 foreach($queries as $index => $query)
75 if (preg_match_all('/'.preg_quote('%').'(.*?)'.preg_quote('%').'/s', $query, $matches)) {
76 foreach($matches[1] as $index_ref)
78 if($index_ref != 'MAIN_QUERY_ID')
80 $index_id = str_replace('INDEX_REF_', '', $index_ref);
81 $query = str_replace('%INDEX_REF_' . $index_id . '%', $idMap['INDEX_REF_' . $index_id], $query);
90 $statement = $this->_db
->prepare($query);
91 $statement->execute();
93 $idMap['INDEX_REF_' . $refIndex] = $this->_db
->lastInsertId();
94 unset($queries[$index]);
96 //update query so that other references are resolved.
97 $queries[$index] = $query;
101 //at this point we have queries left that depend on the main query id
102 foreach($queries as $query)
104 $query = str_replace('%MAIN_QUERY_ID%', end($idMap), $query);
105 $statement = $this->_db
->prepare($query);
106 $statement->execute();
116 public function remove(IDivineEntity
$entity) {