. */ namespace Doctrine\ORM\Persisters; use Doctrine\ORM\EntityManager, Doctrine\ORM\PersistentCollection; /** * Base class for all collection persisters. * * @since 2.0 * @author Roman Borschel */ abstract class AbstractCollectionPersister { /** * * @var EntityManager */ protected $_em; /** * @var \Doctrine\DBAL\Connection */ protected $_conn; /** * * @var \Doctrine\ORM\UnitOfWork */ protected $_uow; /** * Initializes a new instance of a class derived from {@link AbstractCollectionPersister}. * * @param Doctrine\ORM\EntityManager $em */ public function __construct(EntityManager $em) { $this->_em = $em; $this->_uow = $em->getUnitOfWork(); $this->_conn = $em->getConnection(); } /*public function recreate(PersistentCollection $coll) { if ($coll->getRelation()->isInverseSide()) { return; } //... }*/ /** * Deletes the persistent state represented by the given collection. * * @param PersistentCollection $coll */ public function delete(PersistentCollection $coll) { if ($coll->getMapping()->isInverseSide()) { return; // ignore inverse side } $sql = $this->_getDeleteSql($coll); $this->_conn->executeUpdate($sql, $this->_getDeleteSqlParameters($coll)); } /** * Gets the SQL statement for deleting the given collection. * * @param PersistentCollection $coll */ abstract protected function _getDeleteSql(PersistentCollection $coll); /** * Gets the SQL parameters for the corresponding SQL statement to delete * the given collection. * * @param PersistentCollection $coll */ abstract protected function _getDeleteSqlParameters(PersistentCollection $coll); /** * Updates the given collection, synchronizing it's state with the database * by inserting, updating and deleting individual elements. * * @param PersistentCollection $coll */ public function update(PersistentCollection $coll) { if ($coll->getMapping()->isInverseSide()) { return; // ignore inverse side } $this->deleteRows($coll); //$this->updateRows($coll); $this->insertRows($coll); } public function deleteRows(PersistentCollection $coll) { $deleteDiff = $coll->getDeleteDiff(); $sql = $this->_getDeleteRowSql($coll); foreach ($deleteDiff as $element) { $this->_conn->executeUpdate($sql, $this->_getDeleteRowSqlParameters($coll, $element)); } } //public function updateRows(PersistentCollection $coll) //{} public function insertRows(PersistentCollection $coll) { $insertDiff = $coll->getInsertDiff(); $sql = $this->_getInsertRowSql($coll); foreach ($insertDiff as $element) { $this->_conn->executeUpdate($sql, $this->_getInsertRowSqlParameters($coll, $element)); } } /** * Gets the SQL statement used for deleting a row from the collection. * * @param PersistentCollection $coll */ abstract protected function _getDeleteRowSql(PersistentCollection $coll); /** * Gets the SQL parameters for the corresponding SQL statement to delete the given * element from the given collection. * * @param PersistentCollection $coll * @param mixed $element */ abstract protected function _getDeleteRowSqlParameters(PersistentCollection $coll, $element); /** * Gets the SQL statement used for updating a row in the collection. * * @param PersistentCollection $coll */ abstract protected function _getUpdateRowSql(PersistentCollection $coll); /** * Gets the SQL statement used for inserting a row in the collection. * * @param PersistentCollection $coll */ abstract protected function _getInsertRowSql(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 */ abstract protected function _getInsertRowSqlParameters(PersistentCollection $coll, $element); }