Commit f1adfe7c authored by romanb's avatar romanb

Moved association mappings.

parent 81298f96
This diff is collapsed.
<?php
#namespace Doctrine::ORM::Mapping;
/**
* A many-to-many mapping describes the mapping between two collections of
* entities.
*
* @since 2.0
* @todo Rename to ManyToManyMapping
*/
class Doctrine_Association_ManyToMany extends Doctrine_Association
{
/**
* The name of the association class (if an association class is used).
*
* @var string
*/
private $_associationClass;
/** The field in the source table that corresponds to the key in the relation table */
protected $_sourceKeyColumns;
/** The field in the target table that corresponds to the key in the relation table */
protected $_targetKeyColumns;
/** The field in the intermediate table that corresponds to the key in the source table */
protected $_sourceRelationKeyColumns;
/** The field in the intermediate table that corresponds to the key in the target table */
protected $_targetRelationKeyColumns;
/**
* Constructor.
* Creates a new ManyToManyMapping.
*
* @param array $mapping The mapping info.
*/
public function __construct(array $mapping)
{
parent::__construct($mapping);
}
/**
* Validates and completes the mapping.
*
* @param array $mapping
* @override
*/
protected function _validateAndCompleteMapping(array $mapping)
{
parent::_validateAndCompleteMapping($mapping);
if ($this->isOwningSide()) {
// many-many owning MUST have a join table
if ( ! isset($mapping['joinTable'])) {
throw Doctrine_MappingException::joinTableRequired($mapping['fieldName']);
}
// optional attributes for many-many owning side
$this->_associationClass = isset($mapping['associationClass']) ?
$mapping['associationClass'] : null;
}
}
/**
* Whether the mapping uses an association class for the intermediary
* table.
*
* @return boolean
*/
public function usesAssociationClass()
{
return $this->_associationClass !== null;
}
/**
* Gets the name of the association class.
*
* @return string
*/
public function getAssociationClassName()
{
return $this->_associationClass;
}
}
?>
\ No newline at end of file
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.org>.
*/
#namespace Doctrine::ORM::Mapping;
/**
* Represents a one-to-many mapping.
*
* NOTE: One-to-many mappings can currently not be uni-directional (one -> many).
* They must either be bidirectional (one <-> many) or unidirectional (many -> one).
* In other words, the many-side MUST be the owning side and the one-side MUST be
* the inverse side.
*
* @author Roman Borschel <roman@code-factory.org>
* @since 2.0
* @todo Rename to OneToManyMapping
*/
class Doctrine_Association_OneToMany extends Doctrine_Association
{
/** The target foreign key columns that reference the sourceKeyColumns. */
/* NOTE: Currently not used because uni-directional one-many not supported atm. */
//protected $_targetForeignKeyColumns;
/** The (typically primary) source key columns that are referenced by the targetForeignKeyColumns. */
/* NOTE: Currently not used because uni-directional one-many not supported atm. */
//protected $_sourceKeyColumns;
/** This maps the target foreign key columns to the corresponding (primary) source key columns. */
/* NOTE: Currently not used because uni-directional one-many not supported atm. */
//protected $_targetForeignKeysToSourceKeys;
/** This maps the (primary) source key columns to the corresponding target foreign key columns. */
/* NOTE: Currently not used because uni-directional one-many not supported atm. */
//protected $_sourceKeysToTargetForeignKeys;
/** Whether to delete orphaned elements (removed from the collection) */
protected $_deleteOrphans = false;
/**
* Constructor.
* Creates a new OneToManyMapping.
*
* @param array $mapping The mapping info.
*/
public function __construct(array $mapping)
{
parent::__construct($mapping);
}
/**
* Validates and completed the mapping.
*
* @param array $mapping The mapping to validate and complete.
* @return array The validated and completed mapping.
* @override
*/
protected function _validateAndCompleteMapping(array $mapping)
{
parent::_validateAndCompleteMapping($mapping);
// one-side MUST be inverse (must have mappedBy)
if ( ! isset($mapping['mappedBy'])) {
throw Doctrine_MappingException::oneToManyRequiresMappedBy($mapping['fieldName']);
}
$this->_deleteOrphans = isset($mapping['deleteOrphans']) ?
(bool)$mapping['deleteOrphans'] : false;
}
/**
* Whether orphaned elements (removed from the collection) should be deleted.
*
* @return boolean TRUE if orphaned elements should be deleted, FALSE otherwise.
*/
public function shouldDeleteOrphans()
{
return $this->_deleteOrphans;
}
/**
* Whether the association is one-to-many.
*
* @return boolean TRUE if the association is one-to-many, FALSE otherwise.
* @override
*/
public function isOneToMany()
{
return true;
}
}
?>
\ No newline at end of file
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.org>.
*/
#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 <roman@code-factory.org>
* @todo Rename to OneToOneMapping
*/
class Doctrine_Association_OneToOne extends Doctrine_Association
{
/**
* 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);
}
}
?>
\ No newline at end of file
...@@ -1552,7 +1552,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1552,7 +1552,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
* @param Doctrine_Association $assoc * @param Doctrine_Association $assoc
* @param unknown_type $fieldName * @param unknown_type $fieldName
*/ */
private function _registerCustomAssociationAccessors(Doctrine_Association $assoc, $fieldName) private function _registerCustomAssociationAccessors(Doctrine_ORM_Mapping_AssociationMapping $assoc, $fieldName)
{ {
if ($acc = $assoc->getCustomAccessor()) { if ($acc = $assoc->getCustomAccessor()) {
$this->_customAssociationAccessors[$fieldName] = $acc; $this->_customAssociationAccessors[$fieldName] = $acc;
...@@ -1570,7 +1570,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1570,7 +1570,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
public function mapOneToOne(array $mapping) public function mapOneToOne(array $mapping)
{ {
$mapping = $this->_completeAssociationMapping($mapping); $mapping = $this->_completeAssociationMapping($mapping);
$oneToOneMapping = new Doctrine_Association_OneToOne($mapping); $oneToOneMapping = new Doctrine_ORM_Mapping_OneToOneMapping($mapping);
$this->_storeAssociationMapping($oneToOneMapping); $this->_storeAssociationMapping($oneToOneMapping);
/*if ($oneToOneMapping->isInverseSide()) { /*if ($oneToOneMapping->isInverseSide()) {
...@@ -1583,7 +1583,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1583,7 +1583,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
}*/ }*/
} }
private function _registerMappingIfInverse(Doctrine_Association $assoc) private function _registerMappingIfInverse(Doctrine_ORM_Mapping_AssociationMapping $assoc)
{ {
if ($assoc->isInverseSide()) { if ($assoc->isInverseSide()) {
$this->_inverseMappings[$assoc->getMappedByFieldName()] = $assoc; $this->_inverseMappings[$assoc->getMappedByFieldName()] = $assoc;
...@@ -1598,7 +1598,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1598,7 +1598,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
public function mapOneToMany(array $mapping) public function mapOneToMany(array $mapping)
{ {
$mapping = $this->_completeAssociationMapping($mapping); $mapping = $this->_completeAssociationMapping($mapping);
$oneToManyMapping = new Doctrine_Association_OneToMany($mapping); $oneToManyMapping = new Doctrine_ORM_Mapping_OneToManyMapping($mapping);
$this->_storeAssociationMapping($oneToManyMapping); $this->_storeAssociationMapping($oneToManyMapping);
} }
...@@ -1621,7 +1621,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1621,7 +1621,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
public function mapManyToMany(array $mapping) public function mapManyToMany(array $mapping)
{ {
$mapping = $this->_completeAssociationMapping($mapping); $mapping = $this->_completeAssociationMapping($mapping);
$manyToManyMapping = new Doctrine_Association_ManyToManyMapping($mapping); $manyToManyMapping = new Doctrine_ORM_Mapping_ManyToManyMapping($mapping);
$this->_storeAssociationMapping($manyToManyMapping); $this->_storeAssociationMapping($manyToManyMapping);
} }
...@@ -1630,7 +1630,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable ...@@ -1630,7 +1630,7 @@ class Doctrine_ClassMetadata implements Doctrine_Configurable, Serializable
* *
* @param Doctrine_Association $assocMapping * @param Doctrine_Association $assocMapping
*/ */
private function _storeAssociationMapping(Doctrine_Association $assocMapping) private function _storeAssociationMapping(Doctrine_ORM_Mapping_AssociationMapping $assocMapping)
{ {
$sourceFieldName = $assocMapping->getSourceFieldName(); $sourceFieldName = $assocMapping->getSourceFieldName();
if (isset($this->_associationMappings[$sourceFieldName])) { if (isset($this->_associationMappings[$sourceFieldName])) {
......
...@@ -229,7 +229,7 @@ class Doctrine_Collection implements Countable, IteratorAggregate, Serializable, ...@@ -229,7 +229,7 @@ class Doctrine_Collection implements Countable, IteratorAggregate, Serializable,
* *
* @return void * @return void
*/ */
public function _setOwner(Doctrine_Entity $entity, Doctrine_Association $relation) public function _setOwner(Doctrine_Entity $entity, Doctrine_ORM_Mapping_AssociationMapping $relation)
{ {
$this->_owner = $entity; $this->_owner = $entity;
$this->_association = $relation; $this->_association = $relation;
......
...@@ -12,7 +12,7 @@ class Orm_Associations_OneToOneMappingTest extends Doctrine_OrmTestCase ...@@ -12,7 +12,7 @@ class Orm_Associations_OneToOneMappingTest extends Doctrine_OrmTestCase
'sourceEntity' => 'Person', // This is normally filled by ClassMetadata 'sourceEntity' => 'Person', // This is normally filled by ClassMetadata
); );
$oneToOneMapping = new Doctrine_Association_OneToOne($owningSideMapping); $oneToOneMapping = new Doctrine_ORM_Mapping_OneToOneMapping($owningSideMapping);
$this->assertEquals(array('address_id' => 'id'), $oneToOneMapping->getSourceToTargetKeyColumns()); $this->assertEquals(array('address_id' => 'id'), $oneToOneMapping->getSourceToTargetKeyColumns());
$this->assertEquals(array('id' => 'address_id'), $oneToOneMapping->getTargetToSourceKeyColumns()); $this->assertEquals(array('id' => 'address_id'), $oneToOneMapping->getTargetToSourceKeyColumns());
...@@ -29,7 +29,7 @@ class Orm_Associations_OneToOneMappingTest extends Doctrine_OrmTestCase ...@@ -29,7 +29,7 @@ class Orm_Associations_OneToOneMappingTest extends Doctrine_OrmTestCase
'mappedBy' => 'address' 'mappedBy' => 'address'
); );
$oneToOneMapping = new Doctrine_Association_OneToOne($inverseSideMapping); $oneToOneMapping = new Doctrine_ORM_Mapping_OneToOneMapping($inverseSideMapping);
$this->assertEquals('address', $oneToOneMapping->getMappedByFieldName()); $this->assertEquals('address', $oneToOneMapping->getMappedByFieldName());
$this->assertEquals('Address', $oneToOneMapping->getSourceEntityName()); $this->assertEquals('Address', $oneToOneMapping->getSourceEntityName());
$this->assertEquals('Person', $oneToOneMapping->getTargetEntityName()); $this->assertEquals('Person', $oneToOneMapping->getTargetEntityName());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment