. */ #namespace Doctrine::ORM::Mappings; #use Doctrine::ORM::Entity; /** * A one-to-one mapping describes a uni-directional mapping from one entity * to another entity. * * @since 2.0 * @author Roman Borschel * @todo Rename to OneToOneMapping */ class Doctrine_ORM_Mapping_OneToOneMapping extends Doctrine_ORM_Mapping_AssociationMapping { /** * Maps the source foreign/primary key columns to the target primary/foreign key columns. * i.e. source.id (pk) => target.user_id (fk). * Reverse mapping of _targetToSourceKeyColumns. */ protected $_sourceToTargetKeyColumns = array(); /** * Maps the target primary/foreign key columns to the source foreign/primary key columns. * i.e. target.user_id (fk) => source.id (pk). * Reverse mapping of _sourceToTargetKeyColumns. */ protected $_targetToSourceKeyColumns = array(); /** * Whether to delete orphaned elements (when nulled out, i.e. $foo->other = null) * * @var boolean */ protected $_deleteOrphans = false; /** * Constructor. * Creates a new OneToOneMapping. * * @param array $mapping The mapping info. */ public function __construct(array $mapping) { parent::__construct($mapping); } protected function _initMappingArray() { parent::_initMappingArray(); $this->_mapping['deleteOrphans'] = false; } /** * Validates & completes the mapping. Mapping defaults are applied here. * * @param array $mapping The mapping to validate & complete. * @return array The validated & completed mapping. * @override */ protected function _validateAndCompleteMapping(array $mapping) { parent::_validateAndCompleteMapping($mapping); if ($this->isOwningSide()) { if ( ! isset($mapping['joinColumns'])) { throw Doctrine_MappingException::invalidMapping($this->_sourceFieldName); } $this->_sourceToTargetKeyColumns = $mapping['joinColumns']; $this->_targetToSourceKeyColumns = array_flip($this->_sourceToTargetKeyColumns); } $this->_deleteOrphans = isset($mapping['deleteOrphans']) ? (bool)$mapping['deleteOrphans'] : false; return $mapping; } /** * Gets the source-to-target key column mapping. * * @return unknown */ public function getSourceToTargetKeyColumns() { return $this->_sourceToTargetKeyColumns; } /** * Gets the target-to-source key column mapping. * * @return unknown */ public function getTargetToSourceKeyColumns() { return $this->_targetToSourceKeyColumns; } /** * Whether the association is one-to-one. * * @return boolean * @override */ public function isOneToOne() { return true; } /** * Lazy-loads the associated entity for a given entity. * * @param Doctrine::ORM::Entity $entity * @return void */ public function lazyLoadFor(Doctrine_Entity $entity) { if ($entity->getClassName() != $this->_sourceClass->getClassName()) { //error? } $dql = 'SELECT t.* FROM ' . $this->_targetClass->getClassName() . ' t WHERE '; $params = array(); foreach ($this->_sourceToTargetKeyFields as $sourceKeyField => $targetKeyField) { if ($params) { $dql .= " AND "; } $dql .= "t.$targetKeyField = ?"; $params[] = $entity->_rawGetField($sourceKeyField); } $otherEntity = $this->_targetClass->getEntityManager() ->query($dql, $params) ->getFirst(); if ( ! $otherEntity) { $otherEntity = Doctrine_Null::$INSTANCE; } $entity->_internalSetReference($this->_sourceFieldName, $otherEntity); } } ?>