diff -r 000000000000 -r 7f95f8617b0b vendor/doctrine/lib/Doctrine/ORM/Persisters/OneToManyPersister.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/doctrine/lib/Doctrine/ORM/Persisters/OneToManyPersister.php Sat Sep 24 15:40:41 2011 +0200 @@ -0,0 +1,185 @@ +. + */ + +namespace Doctrine\ORM\Persisters; + +use Doctrine\ORM\PersistentCollection, + Doctrine\ORM\UnitOfWork; + +/** + * Persister for one-to-many collections. + * + * IMPORTANT: + * This persister is only used for uni-directional one-to-many mappings on a foreign key + * (which are not yet supported). So currently this persister is not used. + * + * @since 2.0 + * @author Roman Borschel + * @todo Remove + */ +class OneToManyPersister extends AbstractCollectionPersister +{ + /** + * Generates the SQL UPDATE that updates a particular row's foreign + * key to null. + * + * @param PersistentCollection $coll + * @return string + * @override + */ + protected function _getDeleteRowSQL(PersistentCollection $coll) + { + $mapping = $coll->getMapping(); + $targetClass = $this->_em->getClassMetadata($mapping->getTargetEntityName()); + $table = $targetClass->getTableName(); + + $ownerMapping = $targetClass->getAssociationMapping($mapping['mappedBy']); + + $setClause = ''; + foreach ($ownerMapping->sourceToTargetKeyColumns as $sourceCol => $targetCol) { + if ($setClause != '') $setClause .= ', '; + $setClause .= "$sourceCol = NULL"; + } + + $whereClause = ''; + foreach ($targetClass->getIdentifierColumnNames() as $idColumn) { + if ($whereClause != '') $whereClause .= ' AND '; + $whereClause .= "$idColumn = ?"; + } + + return array("UPDATE $table SET $setClause WHERE $whereClause", $this->_uow->getEntityIdentifier($element)); + } + + protected function _getInsertRowSQL(PersistentCollection $coll) + { + return "UPDATE xxx SET foreign_key = yyy WHERE foreign_key = zzz"; + } + + /* Not used for OneToManyPersister */ + protected function _getUpdateRowSQL(PersistentCollection $coll) + { + return; + } + + /** + * Generates the SQL UPDATE that updates all the foreign keys to null. + * + * @param PersistentCollection $coll + */ + protected function _getDeleteSQL(PersistentCollection $coll) + { + + } + + /** + * Gets the SQL parameters for the corresponding SQL statement to delete + * the given collection. + * + * @param PersistentCollection $coll + */ + protected function _getDeleteSQLParameters(PersistentCollection $coll) + {} + + /** + * Gets the SQL parameters for the corresponding SQL statement to insert the given + * element of the given collection into the database. + * + * @param PersistentCollection $coll + * @param mixed $element + */ + protected function _getInsertRowSQLParameters(PersistentCollection $coll, $element) + {} + + /** + * Gets the SQL parameters for the corresponding SQL statement to delete the given + * element from the given collection. + * + * @param PersistentCollection $coll + * @param mixed $element + */ + protected function _getDeleteRowSQLParameters(PersistentCollection $coll, $element) + {} + + /** + * {@inheritdoc} + */ + public function count(PersistentCollection $coll) + { + $mapping = $coll->getMapping(); + $targetClass = $this->_em->getClassMetadata($mapping['targetEntity']); + $sourceClass = $this->_em->getClassMetadata($mapping['sourceEntity']); + + $params = array(); + $id = $this->_em->getUnitOfWork()->getEntityIdentifier($coll->getOwner()); + + $where = ''; + foreach ($targetClass->associationMappings[$mapping['mappedBy']]['joinColumns'] AS $joinColumn) { + if ($where != '') { + $where .= ' AND '; + } + $where .= $joinColumn['name'] . " = ?"; + if ($targetClass->containsForeignIdentifier) { + $params[] = $id[$sourceClass->getFieldForColumn($joinColumn['referencedColumnName'])]; + } else { + $params[] = $id[$sourceClass->fieldNames[$joinColumn['referencedColumnName']]]; + } + } + + $sql = "SELECT count(*) FROM " . $targetClass->getQuotedTableName($this->_conn->getDatabasePlatform()) . " WHERE " . $where; + return $this->_conn->fetchColumn($sql, $params); + } + + /** + * @param PersistentCollection $coll + * @param int $offset + * @param int $length + * @return \Doctrine\Common\Collections\ArrayCollection + */ + public function slice(PersistentCollection $coll, $offset, $length = null) + { + $mapping = $coll->getMapping(); + return $this->_em->getUnitOfWork() + ->getEntityPersister($mapping['targetEntity']) + ->getOneToManyCollection($mapping, $coll->getOwner(), $offset, $length); + } + + /** + * @param PersistentCollection $coll + * @param object $element + */ + public function contains(PersistentCollection $coll, $element) + { + $mapping = $coll->getMapping(); + $uow = $this->_em->getUnitOfWork(); + + // shortcut for new entities + if ($uow->getEntityState($element, UnitOfWork::STATE_NEW) == UnitOfWork::STATE_NEW) { + return false; + } + + // only works with single id identifier entities. Will throw an exception in Entity Persisters + // if that is not the case for the 'mappedBy' field. + $id = current( $uow->getEntityIdentifier($coll->getOwner()) ); + + return $uow->getEntityPersister($mapping['targetEntity']) + ->exists($element, array($mapping['mappedBy'] => $id)); + } +}