vendor/doctrine/lib/Doctrine/ORM/Persisters/JoinedSubclassPersister.php
author cavaliet
Fri, 28 Oct 2011 14:57:11 +0200
changeset 23 6b24cd6b51c5
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Add ModifyTag from tag list. Add Reset Wikipedia info from tag list. Enable boolean from addJavascript controller/template to switch from list or document context.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * This software consists of voluntary contributions made by many individuals
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * and is licensed under the LGPL. For more information, see
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * <http://www.doctrine-project.org>.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
namespace Doctrine\ORM\Persisters;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
use Doctrine\ORM\ORMException,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    Doctrine\ORM\Mapping\ClassMetadata,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    Doctrine\DBAL\LockMode,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    Doctrine\ORM\Query\ResultSetMapping;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 * The joined subclass persister maps a single entity instance to several tables in the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * database as it is defined by the <tt>Class Table Inheritance</tt> strategy.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 * @author Roman Borschel <roman@code-factory.org>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 * @author Benjamin Eberlei <kontakt@beberlei.de>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
 * @since 2.0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
 * @see http://martinfowler.com/eaaCatalog/classTableInheritance.html
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
class JoinedSubclassPersister extends AbstractEntityInheritancePersister
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
     * Map that maps column names to the table names that own them.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     * This is mainly a temporary cache, used during a single request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @var array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    private $_owningTableMap = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
     * Map of table to quoted table names.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
     * 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
     * @var array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    private $_quotedTableMap = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    protected function _getDiscriminatorColumnTableName()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        if ($this->_class->name == $this->_class->rootEntityName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            return $this->_class->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            return $this->_em->getClassMetadata($this->_class->rootEntityName)->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * This function finds the ClassMetadata instance in an inheritance hierarchy
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     * that is responsible for enabling versioning.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
     * @return Doctrine\ORM\Mapping\ClassMetadata
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    private function _getVersionedClassMetadata()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        if (isset($this->_class->fieldMappings[$this->_class->versionField]['inherited'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
            $definingClassName = $this->_class->fieldMappings[$this->_class->versionField]['inherited'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            return $this->_em->getClassMetadata($definingClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        return $this->_class;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
     * Gets the name of the table that owns the column the given field is mapped to.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
     * @param string $fieldName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
     * @override
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    public function getOwningTable($fieldName)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
        if (!isset($this->_owningTableMap[$fieldName])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
            if (isset($this->_class->associationMappings[$fieldName]['inherited'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
                $cm = $this->_em->getClassMetadata($this->_class->associationMappings[$fieldName]['inherited']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
            } else if (isset($this->_class->fieldMappings[$fieldName]['inherited'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                $cm = $this->_em->getClassMetadata($this->_class->fieldMappings[$fieldName]['inherited']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                $cm = $this->_class;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            $this->_owningTableMap[$fieldName] = $cm->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
            $this->_quotedTableMap[$cm->table['name']] = $cm->getQuotedTableName($this->_platform);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        return $this->_owningTableMap[$fieldName];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    public function executeInserts()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        if ( ! $this->_queuedInserts) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
            return;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        $postInsertIds = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        $idGen = $this->_class->idGenerator;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        $isPostInsertId = $idGen->isPostInsertGenerator();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        // Prepare statement for the root table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $rootClass = $this->_class->name == $this->_class->rootEntityName ?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
                $this->_class : $this->_em->getClassMetadata($this->_class->rootEntityName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        $rootPersister = $this->_em->getUnitOfWork()->getEntityPersister($rootClass->name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        $rootTableName = $rootClass->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        $rootTableStmt = $this->_conn->prepare($rootPersister->_getInsertSQL());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        // Prepare statements for sub tables.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        $subTableStmts = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        if ($rootClass !== $this->_class) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
            $subTableStmts[$this->_class->table['name']] = $this->_conn->prepare($this->_getInsertSQL());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        foreach ($this->_class->parentClasses as $parentClassName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
            $parentClass = $this->_em->getClassMetadata($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
            $parentTableName = $parentClass->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
            if ($parentClass !== $rootClass) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
                $parentPersister = $this->_em->getUnitOfWork()->getEntityPersister($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
                $subTableStmts[$parentTableName] = $this->_conn->prepare($parentPersister->_getInsertSQL());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        // Execute all inserts. For each entity:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        // 1) Insert on root table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        // 2) Insert on sub tables
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        foreach ($this->_queuedInserts as $entity) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
            $insertData = $this->_prepareInsertData($entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
            // Execute insert on root table
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
            $paramIndex = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
            foreach ($insertData[$rootTableName] as $columnName => $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
                $rootTableStmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
            $rootTableStmt->execute();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
            if ($isPostInsertId) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
                $id = $idGen->generate($this->_em, $entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
                $postInsertIds[$id] = $entity;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
                $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
            // Execute inserts on subtables.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
            // The order doesn't matter because all child tables link to the root table via FK.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
            foreach ($subTableStmts as $tableName => $stmt) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
                $data = isset($insertData[$tableName]) ? $insertData[$tableName] : array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
                $paramIndex = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
                foreach ((array) $id as $idVal) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
                    $stmt->bindValue($paramIndex++, $idVal);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
                foreach ($data as $columnName => $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
                    $stmt->bindValue($paramIndex++, $value, $this->_columnTypes[$columnName]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
                $stmt->execute();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        $rootTableStmt->closeCursor();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        foreach ($subTableStmts as $stmt) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
            $stmt->closeCursor();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
        if ($this->_class->isVersioned) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
            $this->assignDefaultVersionValue($entity, $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
        $this->_queuedInserts = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
        return $postInsertIds;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
    public function update($entity)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
        $updateData = $this->_prepareUpdateData($entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
        if ($isVersioned = $this->_class->isVersioned) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            $versionedClass = $this->_getVersionedClassMetadata();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
            $versionedTable = $versionedClass->table['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        if ($updateData) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
            foreach ($updateData as $tableName => $data) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                $this->_updateTable($entity, $this->_quotedTableMap[$tableName], $data, $isVersioned && $versionedTable == $tableName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
            // Make sure the table with the version column is updated even if no columns on that
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
            // table were affected.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
            if ($isVersioned && ! isset($updateData[$versionedTable])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
                $this->_updateTable($entity, $versionedClass->getQuotedTableName($this->_platform), array(), true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
                $id = $this->_em->getUnitOfWork()->getEntityIdentifier($entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
                $this->assignDefaultVersionValue($entity, $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
    public function delete($entity)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
        $identifier = $this->_em->getUnitOfWork()->getEntityIdentifier($entity);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
        $this->deleteJoinTableRecords($identifier);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
        $id = array_combine($this->_class->getIdentifierColumnNames(), $identifier);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        // If the database platform supports FKs, just
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
        // delete the row from the root table. Cascades do the rest.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
        if ($this->_platform->supportsForeignKeyConstraints()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
            $this->_conn->delete($this->_em->getClassMetadata($this->_class->rootEntityName)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
                    ->getQuotedTableName($this->_platform), $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
            // Delete from all tables individually, starting from this class' table up to the root table.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
            $this->_conn->delete($this->_class->getQuotedTableName($this->_platform), $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
            foreach ($this->_class->parentClasses as $parentClass) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
                $this->_conn->delete($this->_em->getClassMetadata($parentClass)->getQuotedTableName($this->_platform), $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
    protected function _getSelectEntitiesSQL(array $criteria, $assoc = null, $lockMode = 0, $limit = null, $offset = null, array $orderBy = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        $idColumns = $this->_class->getIdentifierColumnNames();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        $baseTableAlias = $this->_getSQLTableAlias($this->_class->name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
        // Create the column list fragment only once
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
        if ($this->_selectColumnListSql === null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
            $this->_rsm = new ResultSetMapping();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
            $this->_rsm->addEntityResult($this->_class->name, 'r');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
            
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
            // Add regular columns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
            $columnList = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
            foreach ($this->_class->fieldMappings as $fieldName => $mapping) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
                if ($columnList != '') $columnList .= ', ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
                $columnList .= $this->_getSelectColumnSQL($fieldName,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
                        isset($mapping['inherited']) ?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
                        $this->_em->getClassMetadata($mapping['inherited']) :
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
                        $this->_class);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
            // Add foreign key columns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
            foreach ($this->_class->associationMappings as $assoc2) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
                if ($assoc2['isOwningSide'] && $assoc2['type'] & ClassMetadata::TO_ONE) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
                    $tableAlias = isset($assoc2['inherited']) ?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
                            $this->_getSQLTableAlias($assoc2['inherited'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
                            : $baseTableAlias;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
                    foreach ($assoc2['targetToSourceKeyColumns'] as $srcColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
                        if ($columnList != '') $columnList .= ', ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
                        $columnList .= $this->getSelectJoinColumnSQL($tableAlias, $srcColumn,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
                            isset($assoc2['inherited']) ? $assoc2['inherited'] : $this->_class->name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
                        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
            // Add discriminator column (DO NOT ALIAS, see AbstractEntityInheritancePersister#_processSQLResult).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
            $discrColumn = $this->_class->discriminatorColumn['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
            if ($this->_class->rootEntityName == $this->_class->name) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
                $columnList .= ", $baseTableAlias.$discrColumn";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
                $columnList .= ', ' . $this->_getSQLTableAlias($this->_class->rootEntityName)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
                        . ".$discrColumn";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
            $resultColumnName = $this->_platform->getSQLResultCasing($discrColumn);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
            $this->_rsm->setDiscriminatorColumn('r', $resultColumnName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
            $this->_rsm->addMetaResult('r', $resultColumnName, $discrColumn);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        // INNER JOIN parent tables
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        $joinSql = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        foreach ($this->_class->parentClasses as $parentClassName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
            $parentClass = $this->_em->getClassMetadata($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
            $tableAlias = $this->_getSQLTableAlias($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
            $joinSql .= ' INNER JOIN ' . $parentClass->getQuotedTableName($this->_platform) . ' ' . $tableAlias . ' ON ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
            $first = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
            foreach ($idColumns as $idColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
                if ($first) $first = false; else $joinSql .= ' AND ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
                $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
        // OUTER JOIN sub tables
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
        foreach ($this->_class->subClasses as $subClassName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
            $subClass = $this->_em->getClassMetadata($subClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
            $tableAlias = $this->_getSQLTableAlias($subClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
            if ($this->_selectColumnListSql === null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
                // Add subclass columns
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
                foreach ($subClass->fieldMappings as $fieldName => $mapping) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
                    if (isset($mapping['inherited'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
                        continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
                    $columnList .= ', ' . $this->_getSelectColumnSQL($fieldName, $subClass);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
                // Add join columns (foreign keys)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
                foreach ($subClass->associationMappings as $assoc2) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
                    if ($assoc2['isOwningSide'] && $assoc2['type'] & ClassMetadata::TO_ONE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
                            && ! isset($assoc2['inherited'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
                        foreach ($assoc2['targetToSourceKeyColumns'] as $srcColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
                            if ($columnList != '') $columnList .= ', ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
                            $columnList .= $this->getSelectJoinColumnSQL($tableAlias, $srcColumn,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
                                isset($assoc2['inherited']) ? $assoc2['inherited'] : $subClass->name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
                            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
                        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
            // Add LEFT JOIN
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
            $joinSql .= ' LEFT JOIN ' . $subClass->getQuotedTableName($this->_platform) . ' ' . $tableAlias . ' ON ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
            $first = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
            foreach ($idColumns as $idColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
                if ($first) $first = false; else $joinSql .= ' AND ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
                $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        $joinSql .= $assoc != null && $assoc['type'] == ClassMetadata::MANY_TO_MANY ?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
                $this->_getSelectManyToManyJoinSQL($assoc) : '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
        $conditionSql = $this->_getSelectConditionSQL($criteria, $assoc);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
        $orderBy = ($assoc !== null && isset($assoc['orderBy'])) ? $assoc['orderBy'] : $orderBy;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
        $orderBySql = $orderBy ? $this->_getOrderBySQL($orderBy, $baseTableAlias) : '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
        if ($this->_selectColumnListSql === null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
            $this->_selectColumnListSql = $columnList;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
        $lockSql = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        if ($lockMode == LockMode::PESSIMISTIC_READ) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
            $lockSql = ' ' . $this->_platform->getReadLockSql();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
        } else if ($lockMode == LockMode::PESSIMISTIC_WRITE) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
            $lockSql = ' ' . $this->_platform->getWriteLockSql();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
        return $this->_platform->modifyLimitQuery('SELECT ' . $this->_selectColumnListSql
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
                . ' FROM ' . $this->_class->getQuotedTableName($this->_platform) . ' ' . $baseTableAlias
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
                . $joinSql
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
                . ($conditionSql != '' ? ' WHERE ' . $conditionSql : '') . $orderBySql, $limit, $offset)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
                . $lockSql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
     * Get the FROM and optionally JOIN conditions to lock the entity managed by this persister.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
    public function getLockTablesSql()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
        $idColumns = $this->_class->getIdentifierColumnNames();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
        $baseTableAlias = $this->_getSQLTableAlias($this->_class->name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
        // INNER JOIN parent tables
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
        $joinSql = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
        foreach ($this->_class->parentClasses as $parentClassName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
            $parentClass = $this->_em->getClassMetadata($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
            $tableAlias = $this->_getSQLTableAlias($parentClassName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
            $joinSql .= ' INNER JOIN ' . $parentClass->getQuotedTableName($this->_platform) . ' ' . $tableAlias . ' ON ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
            $first = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
            foreach ($idColumns as $idColumn) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
                if ($first) $first = false; else $joinSql .= ' AND ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
                $joinSql .= $baseTableAlias . '.' . $idColumn . ' = ' . $tableAlias . '.' . $idColumn;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        return 'FROM ' . $this->_class->getQuotedTableName($this->_platform) . ' ' . $baseTableAlias . $joinSql;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
    /* Ensure this method is never called. This persister overrides _getSelectEntitiesSQL directly. */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
    protected function _getSelectColumnListSQL()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
        throw new \BadMethodCallException("Illegal invocation of ".__METHOD__.".");
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
    /** {@inheritdoc} */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
    protected function _getInsertColumnList()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
        // Identifier columns must always come first in the column list of subclasses.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
        $columns = $this->_class->parentClasses ? $this->_class->getIdentifierColumnNames() : array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
        foreach ($this->_class->reflFields as $name => $field) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
            if (isset($this->_class->fieldMappings[$name]['inherited']) && ! isset($this->_class->fieldMappings[$name]['id'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
                    || isset($this->_class->associationMappings[$name]['inherited'])
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
                    || ($this->_class->isVersioned && $this->_class->versionField == $name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
            if (isset($this->_class->associationMappings[$name])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
                $assoc = $this->_class->associationMappings[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
                if ($assoc['type'] & ClassMetadata::TO_ONE && $assoc['isOwningSide']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
                    foreach ($assoc['targetToSourceKeyColumns'] as $sourceCol) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
                        $columns[] = $sourceCol;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
            } else if ($this->_class->name != $this->_class->rootEntityName ||
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
                    ! $this->_class->isIdGeneratorIdentity() || $this->_class->identifier[0] != $name) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
                $columns[] = $this->_class->getQuotedColumnName($name, $this->_platform);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
        // Add discriminator column if it is the topmost class.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
        if ($this->_class->name == $this->_class->rootEntityName) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
            $columns[] = $this->_class->discriminatorColumn['name'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
        return $columns;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    protected function assignDefaultVersionValue($entity, $id)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
        $value = $this->fetchVersionValue($this->_getVersionedClassMetadata(), $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
        $this->_class->setFieldValue($entity, $this->_class->versionField, $value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
}