SingleTablePersister.php 4.15 KB
Newer Older
romanb's avatar
romanb committed
1
<?php
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 *  $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.doctrine-project.org>.
 */
romanb's avatar
romanb committed
21

22 23
namespace Doctrine\ORM\Persisters;

24
use Doctrine\ORM\Mapping\ClassMetadata;
25

26 27 28 29
/**
 * Persister for entities that participate in a hierarchy mapped with the
 * SINGLE_TABLE strategy.
 *
30 31 32 33
 * @author Roman Borschel <roman@code-factory.org>
 * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @since 2.0
 * @link http://martinfowler.com/eaaCatalog/singleTableInheritance.html
34
 */
35
class SingleTablePersister extends AbstractEntityInheritancePersister
36
{
37 38
    /** {@inheritdoc} */
    protected function _getDiscriminatorColumnTableName()
39
    {
40
        return $this->_class->table['name'];
41
    }
42 43

    /** {@inheritdoc} */
44
    protected function _getSelectColumnListSQL()
45
    {
46
        $columnList = parent::_getSelectColumnListSQL();
47
        // Append discriminator column
48 49 50 51 52 53 54
        $discrColumn = $this->_class->discriminatorColumn['name'];
        $columnList .= ", $discrColumn";
        $rootClass = $this->_em->getClassMetadata($this->_class->rootEntityName);
        $tableAlias = $this->_getSQLTableAlias($rootClass);
        $resultColumnName = $this->_platform->getSQLResultCasing($discrColumn);
        $this->_resultColumnNames[$resultColumnName] = $discrColumn;

55 56 57 58 59
        foreach ($this->_class->subClasses as $subClassName) {
            $subClass = $this->_em->getClassMetadata($subClassName);
            // Append subclass columns
            foreach ($subClass->fieldMappings as $fieldName => $mapping) {
                if ( ! isset($mapping['inherited'])) {
60
                    $columnList .= ', ' . $this->_getSelectColumnSQL($fieldName, $subClass);
61 62
                }
            }
63

64 65 66 67
            // Append subclass foreign keys
            foreach ($subClass->associationMappings as $assoc) {
                if ($assoc->isOwningSide && $assoc->isOneToOne() && ! isset($subClass->inheritedAssociationFields[$assoc->sourceFieldName])) {
                    foreach ($assoc->targetToSourceKeyColumns as $srcColumn) {
68 69 70 71
                        $columnAlias = $srcColumn . $this->_sqlAliasCounter++;
                        $columnList .= ', ' . $tableAlias . ".$srcColumn AS $columnAlias";
                        $resultColumnName = $this->_platform->getSQLResultCasing($columnAlias);
                        if ( ! isset($this->_resultColumnNames[$resultColumnName])) {
72 73
                            $this->_resultColumnNames[$resultColumnName] = $srcColumn;
                        }
74 75 76 77 78 79 80
                    }
                }
            }
        }

        return $columnList;
    }
81

82
    /** {@inheritdoc} */
83 84 85 86
    protected function _getInsertColumnList()
    {
        $columns = parent::_getInsertColumnList();
        // Add discriminator column to the INSERT SQL
87 88
        $columns[] = $this->_class->discriminatorColumn['name'];

89 90
        return $columns;
    }
91

92
    /** {@inheritdoc} */
93 94 95 96 97
    protected function _getSQLTableAlias(ClassMetadata $class)
    {
        if (isset($this->_sqlTableAliases[$class->rootEntityName])) {
            return $this->_sqlTableAliases[$class->rootEntityName];
        }
98
        $tableAlias = $this->_em->getClassMetadata($class->rootEntityName)->table['name'][0] . $this->_sqlAliasCounter++;
99 100 101
        $this->_sqlTableAliases[$class->rootEntityName] = $tableAlias;

        return $tableAlias;
102
    }
103
}