. */ /** * Doctrine_Hydrate_RecordDriver * Hydration strategy used for creating graphs of entity objects. * * @package Doctrine * @subpackage Hydrate * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.phpdoctrine.org * @since 1.0 * @version $Revision$ * @author Konsta Vesterinen * @author Roman Borschel */ class Doctrine_Hydrator_RecordDriver { protected $_collections = array(); protected $_mappers = array(); private $_nullObject; public function __construct() { $this->_nullObject = Doctrine_Null::$INSTANCE; } public function getElementCollection($component) { $coll = new Doctrine_Collection($component); $this->_collections[] = $coll; return $coll; } public function getLastKey($coll) { $coll->end(); return $coll->key(); } public function initRelated($record, $name) { return true; /* if ( ! is_array($record)) { $record[$name]; return true; } return false; */ } public function registerCollection(Doctrine_Collection $coll) { $this->_collections[] = $coll; } /** * isIdentifiable * returns whether or not a given data row is identifiable (it contains * all primary key fields specified in the second argument) * * @param array $row * @param Doctrine_Table $table * @return boolean */ /*public function isIdentifiable(array $row, Doctrine_Table $table) { $primaryKeys = $table->getIdentifierColumnNames(); if (is_array($primaryKeys)) { foreach ($primaryKeys as $id) { if ( ! isset($row[$id])) { return false; } } } else { if ( ! isset($row[$primaryKeys])) { return false; } } return true; }*/ public function getNullPointer() { return $this->_nullObject; } public function getElement(array $data, $className) { $className = $this->_getClassnameToReturn($data, $className); if ( ! isset($this->_mappers[$className])) { $this->_mappers[$className] = Doctrine_Manager::getInstance()->getMapper($className); } $record = $this->_mappers[$className]->getRecord($data); return $record; } public function flush() { // take snapshots from all initialized collections foreach ($this->_collections as $coll) { $coll->takeSnapshot(); } $this->_collections = array(); $this->_mappers = array(); } /** * Check the dataset for a discriminator column to determine the correct * class to instantiate. If no discriminator column is found, the given * classname will be returned. * * @return string The name of the class to instantiate. * @todo Can be optimized performance-wise. */ protected function _getClassnameToReturn(array $data, $className) { if ( ! isset($this->_mappers[$className])) { $this->_mappers[$className] = Doctrine_Manager::getInstance()->getMapper($className); } $discCol = $this->_mappers[$className]->getClassMetadata()->getInheritanceOption('discriminatorColumn'); if ( ! $discCol) { return $className; } $discMap = $this->_mappers[$className]->getClassMetadata()->getInheritanceOption('discriminatorMap'); if (isset($data[$discCol], $discMap[$data[$discCol]])) { return $discMap[$data[$discCol]]; } else { return $className; } } }