diff --git a/lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php b/lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php index 189809697..250f7c0ef 100644 --- a/lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php +++ b/lib/Doctrine/ORM/Persisters/AbstractCollectionPersister.php @@ -65,9 +65,11 @@ abstract class AbstractCollectionPersister public function delete(PersistentCollection $coll) { $mapping = $coll->getMapping(); + if ( ! $mapping['isOwningSide']) { return; // ignore inverse side } + $sql = $this->_getDeleteSQL($coll); $this->_conn->executeUpdate($sql, $this->_getDeleteSQLParameters($coll)); } @@ -96,9 +98,11 @@ abstract class AbstractCollectionPersister public function update(PersistentCollection $coll) { $mapping = $coll->getMapping(); + if ( ! $mapping['isOwningSide']) { return; // ignore inverse side } + $this->deleteRows($coll); //$this->updateRows($coll); $this->insertRows($coll); @@ -108,6 +112,7 @@ abstract class AbstractCollectionPersister { $deleteDiff = $coll->getDeleteDiff(); $sql = $this->_getDeleteRowSQL($coll); + foreach ($deleteDiff as $element) { $this->_conn->executeUpdate($sql, $this->_getDeleteRowSQLParameters($coll, $element)); } @@ -120,6 +125,7 @@ abstract class AbstractCollectionPersister { $insertDiff = $coll->getInsertDiff(); $sql = $this->_getInsertRowSQL($coll); + foreach ($insertDiff as $element) { $this->_conn->executeUpdate($sql, $this->_getInsertRowSQLParameters($coll, $element)); } diff --git a/lib/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php b/lib/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php index 425da798a..670cf11e7 100644 --- a/lib/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php +++ b/lib/Doctrine/ORM/Persisters/AbstractEntityInheritancePersister.php @@ -39,10 +39,12 @@ abstract class AbstractEntityInheritancePersister extends BasicEntityPersister protected function _prepareInsertData($entity) { $data = parent::_prepareInsertData($entity); + // Populate the discriminator column $discColumn = $this->_class->discriminatorColumn; $this->_columnTypes[$discColumn['name']] = $discColumn['type']; $data[$this->_getDiscriminatorColumnTableName()][$discColumn['name']] = $this->_class->discriminatorValue; + return $data; } @@ -63,7 +65,7 @@ abstract class AbstractEntityInheritancePersister extends BasicEntityPersister $columnAlias = $this->_platform->getSQLResultCasing($columnName . $this->_sqlAliasCounter++); $this->_rsm->addFieldResult($alias, $columnAlias, $field, $class->name); - return "$sql AS $columnAlias"; + return $sql . ' AS ' . $columnAlias; } protected function getSelectJoinColumnSQL($tableAlias, $joinColumnName, $className) @@ -72,6 +74,6 @@ abstract class AbstractEntityInheritancePersister extends BasicEntityPersister $resultColumnName = $this->_platform->getSQLResultCasing($columnAlias); $this->_rsm->addMetaResult('r', $resultColumnName, $joinColumnName); - return $tableAlias . ".$joinColumnName AS $columnAlias"; + return $tableAlias . '.' . $joinColumnName . ' AS ' . $columnAlias; } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index 328e3f091..590df6894 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -229,6 +229,7 @@ class BasicEntityPersister if (isset($insertData[$tableName])) { $paramIndex = 1; + foreach ($insertData[$tableName] as $column => $value) { $stmt->bindValue($paramIndex++, $value, $this->_columnTypes[$column]); } diff --git a/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php b/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php index 715495b01..abc3fbc79 100644 --- a/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php +++ b/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php @@ -22,6 +22,7 @@ namespace Doctrine\ORM\Persisters; use Doctrine\ORM\ORMException, Doctrine\ORM\Mapping\ClassMetadata, Doctrine\DBAL\LockMode, + Doctrine\DBAL\Types\Type, Doctrine\ORM\Query\ResultSetMapping; /** @@ -143,9 +144,11 @@ class JoinedSubclassPersister extends AbstractEntityInheritancePersister // Execute insert on root table $paramIndex = 1; + foreach ($insertData[$rootTableName] as $columnName => $value) { $rootTableStmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]); } + $rootTableStmt->execute(); if ($isPostInsertId) { @@ -160,12 +163,17 @@ class JoinedSubclassPersister extends AbstractEntityInheritancePersister foreach ($subTableStmts as $tableName => $stmt) { $data = isset($insertData[$tableName]) ? $insertData[$tableName] : array(); $paramIndex = 1; - foreach ((array) $id as $idVal) { - $stmt->bindValue($paramIndex++, $idVal); + + foreach ((array) $id as $idName => $idVal) { + $type = isset($this->_columnTypes[$idName]) ? $this->_columnTypes[$idName] : Type::STRING; + + $stmt->bindValue($paramIndex++, $idVal, $type); } + foreach ($data as $columnName => $value) { $stmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]); } + $stmt->execute(); } } @@ -191,7 +199,7 @@ class JoinedSubclassPersister extends AbstractEntityInheritancePersister { $updateData = $this->_prepareUpdateData($entity); - if ($isVersioned = $this->_class->isVersioned) { + if (($isVersioned = $this->_class->isVersioned) != false) { $versionedClass = $this->_getVersionedClassMetadata(); $versionedTable = $versionedClass->table['name']; } @@ -200,6 +208,7 @@ class JoinedSubclassPersister extends AbstractEntityInheritancePersister foreach ($updateData as $tableName => $data) { $this->_updateTable($entity, $this->_quotedTableMap[$tableName], $data, $isVersioned && $versionedTable == $tableName); } + // Make sure the table with the version column is updated even if no columns on that // table were affected. if ($isVersioned && ! isset($updateData[$versionedTable])) { @@ -229,6 +238,7 @@ class JoinedSubclassPersister extends AbstractEntityInheritancePersister } else { // Delete from all tables individually, starting from this class' table up to the root table. $this->_conn->delete($this->_class->getQuotedTableName($this->_platform), $id); + foreach ($this->_class->parentClasses as $parentClass) { $this->_conn->delete($this->_em->getClassMetadata($parentClass)->getQuotedTableName($this->_platform), $id); } diff --git a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php index 6ca2b15a5..ce794781c 100644 --- a/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/ManyToManyPersister.php @@ -39,9 +39,10 @@ class ManyToManyPersister extends AbstractCollectionPersister */ protected function _getDeleteRowSQL(PersistentCollection $coll) { - $mapping = $coll->getMapping(); + $mapping = $coll->getMapping(); $joinTable = $mapping['joinTable']; - $columns = $mapping['joinTableColumns']; + $columns = $mapping['joinTableColumns']; + return 'DELETE FROM ' . $joinTable['name'] . ' WHERE ' . implode(' = ? AND ', $columns) . ' = ?'; }