AbstractEntityInheritancePersister.php
9 months ago
BasicEntityPersister.php
8 months ago
CachedPersisterContext.php
9 months ago
EntityPersister.php
9 months ago
JoinedSubclassPersister.php
9 months ago
SingleTablePersister.php
9 months ago
index.php
9 months ago
SingleTablePersister.php
109 lines
| 1 | <?php |
| 2 | declare (strict_types=1); |
| 3 | namespace MailPoetVendor\Doctrine\ORM\Persisters\Entity; |
| 4 | if (!defined('ABSPATH')) exit; |
| 5 | use MailPoetVendor\Doctrine\Common\Collections\Criteria; |
| 6 | use MailPoetVendor\Doctrine\ORM\Internal\SQLResultCasing; |
| 7 | use MailPoetVendor\Doctrine\ORM\Mapping\ClassMetadata; |
| 8 | use MailPoetVendor\Doctrine\ORM\Utility\PersisterHelper; |
| 9 | use function array_flip; |
| 10 | use function array_intersect; |
| 11 | use function array_map; |
| 12 | use function array_unshift; |
| 13 | use function implode; |
| 14 | class SingleTablePersister extends AbstractEntityInheritancePersister |
| 15 | { |
| 16 | use SQLResultCasing; |
| 17 | protected function getDiscriminatorColumnTableName() |
| 18 | { |
| 19 | return $this->class->getTableName(); |
| 20 | } |
| 21 | protected function getSelectColumnsSQL() |
| 22 | { |
| 23 | if ($this->currentPersisterContext->selectColumnListSql !== null && $this->isFilterHashUpToDate()) { |
| 24 | return $this->currentPersisterContext->selectColumnListSql; |
| 25 | } |
| 26 | $columnList[] = parent::getSelectColumnsSQL(); |
| 27 | $rootClass = $this->em->getClassMetadata($this->class->rootEntityName); |
| 28 | $tableAlias = $this->getSQLTableAlias($rootClass->name); |
| 29 | // Append discriminator column |
| 30 | $discrColumn = $this->class->getDiscriminatorColumn(); |
| 31 | $discrColumnName = $discrColumn['name']; |
| 32 | $discrColumnType = $discrColumn['type']; |
| 33 | $columnList[] = $tableAlias . '.' . $discrColumnName; |
| 34 | $resultColumnName = $this->getSQLResultCasing($this->platform, $discrColumnName); |
| 35 | $this->currentPersisterContext->rsm->setDiscriminatorColumn('r', $resultColumnName); |
| 36 | $this->currentPersisterContext->rsm->addMetaResult('r', $resultColumnName, $discrColumnName, \false, $discrColumnType); |
| 37 | // Append subclass columns |
| 38 | foreach ($this->class->subClasses as $subClassName) { |
| 39 | $subClass = $this->em->getClassMetadata($subClassName); |
| 40 | // Regular columns |
| 41 | foreach ($subClass->fieldMappings as $fieldName => $mapping) { |
| 42 | if (isset($mapping['inherited'])) { |
| 43 | continue; |
| 44 | } |
| 45 | $columnList[] = $this->getSelectColumnSQL($fieldName, $subClass); |
| 46 | } |
| 47 | // Foreign key columns |
| 48 | foreach ($subClass->associationMappings as $assoc) { |
| 49 | if (!$assoc['isOwningSide'] || !($assoc['type'] & ClassMetadata::TO_ONE) || isset($assoc['inherited'])) { |
| 50 | continue; |
| 51 | } |
| 52 | $targetClass = $this->em->getClassMetadata($assoc['targetEntity']); |
| 53 | foreach ($assoc['joinColumns'] as $joinColumn) { |
| 54 | $columnList[] = $this->getSelectJoinColumnSQL($tableAlias, $joinColumn['name'], $this->quoteStrategy->getJoinColumnName($joinColumn, $subClass, $this->platform), PersisterHelper::getTypeOfColumn($joinColumn['referencedColumnName'], $targetClass, $this->em)); |
| 55 | } |
| 56 | } |
| 57 | } |
| 58 | $this->currentPersisterContext->selectColumnListSql = implode(', ', $columnList); |
| 59 | $this->updateFilterHash(); |
| 60 | return $this->currentPersisterContext->selectColumnListSql; |
| 61 | } |
| 62 | protected function getInsertColumnList() |
| 63 | { |
| 64 | $columns = parent::getInsertColumnList(); |
| 65 | // Add discriminator column to the INSERT SQL |
| 66 | $columns[] = $this->class->getDiscriminatorColumn()['name']; |
| 67 | return $columns; |
| 68 | } |
| 69 | protected function getSQLTableAlias($className, $assocName = '') |
| 70 | { |
| 71 | return parent::getSQLTableAlias($this->class->rootEntityName, $assocName); |
| 72 | } |
| 73 | protected function getSelectConditionSQL(array $criteria, $assoc = null) |
| 74 | { |
| 75 | $conditionSql = parent::getSelectConditionSQL($criteria, $assoc); |
| 76 | if ($conditionSql) { |
| 77 | $conditionSql .= ' AND '; |
| 78 | } |
| 79 | return $conditionSql . $this->getSelectConditionDiscriminatorValueSQL(); |
| 80 | } |
| 81 | protected function getSelectConditionCriteriaSQL(Criteria $criteria) |
| 82 | { |
| 83 | $conditionSql = parent::getSelectConditionCriteriaSQL($criteria); |
| 84 | if ($conditionSql) { |
| 85 | $conditionSql .= ' AND '; |
| 86 | } |
| 87 | return $conditionSql . $this->getSelectConditionDiscriminatorValueSQL(); |
| 88 | } |
| 89 | protected function getSelectConditionDiscriminatorValueSQL() |
| 90 | { |
| 91 | $values = array_map([$this->conn, 'quote'], array_flip(array_intersect($this->class->discriminatorMap, $this->class->subClasses))); |
| 92 | if ($this->class->discriminatorValue !== null) { |
| 93 | // discriminators can be 0 |
| 94 | array_unshift($values, $this->conn->quote($this->class->discriminatorValue)); |
| 95 | } |
| 96 | $discColumnName = $this->class->getDiscriminatorColumn()['name']; |
| 97 | $values = implode(', ', $values); |
| 98 | $tableAlias = $this->getSQLTableAlias($this->class->name); |
| 99 | return $tableAlias . '.' . $discColumnName . ' IN (' . $values . ')'; |
| 100 | } |
| 101 | protected function generateFilterConditionSQL(ClassMetadata $targetEntity, $targetTableAlias) |
| 102 | { |
| 103 | // Ensure that the filters are applied to the root entity of the inheritance tree |
| 104 | $targetEntity = $this->em->getClassMetadata($targetEntity->rootEntityName); |
| 105 | // we don't care about the $targetTableAlias, in a STI there is only one table. |
| 106 | return parent::generateFilterConditionSQL($targetEntity, $targetTableAlias); |
| 107 | } |
| 108 | } |
| 109 |