diff --git a/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php b/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php index 5e07494796a..8a92a21d7ae 100644 --- a/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php +++ b/lib/Doctrine/ORM/Mapping/Builder/ClassMetadataBuilder.php @@ -23,6 +23,7 @@ use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\DiscriminatorColumnMetadata; use Doctrine\ORM\Mapping\FieldMetadata; +use Doctrine\ORM\Mapping\TableMetadata; use Doctrine\ORM\Mapping\VersionFieldMetadata; /** @@ -132,23 +133,15 @@ public function setReadOnly() } /** - * Sets the table name. + * Sets the table metadata. * - * @param string $name - * @param string|null $schema - * @param array $options + * @param TableMetadata $tableMetadata * * @return ClassMetadataBuilder */ - public function setTable($name, $schema = null, array $options = []) + public function withTable(TableMetadata $tableMetadata) { - $this->cm->setPrimaryTable( - [ - 'name' => $name, - 'schema' => $schema, - 'options' => $options, - ] - ); + $this->cm->setPrimaryTable($tableMetadata); return $this; } @@ -169,86 +162,6 @@ public function setCache($usage, $region = null) ); } - /** - * Adds Index. - * - * @param array $columns - * @param string|null $name - * @param bool $unique - * @param array $options - * @param array $flags - * - * @return ClassMetadataBuilder - */ - public function addIndex(array $columns, $name, $unique = false, array $options = [], array $flags = []) - { - if (!isset($this->cm->table['indexes'])) { - $this->cm->table['indexes'] = []; - } - - $index = [ - 'columns' => $columns, - 'unique' => $unique, - ]; - - if ( ! empty($options)) { - $index['options'] = $options; - } - - if ( ! empty($flags)) { - $index['flags'] = $flags; - } - - if (!$name) { - $this->cm->table['indexes'][] = $index; - - return $this; - } - - $this->cm->table['indexes'][$name] = $index; - - return $this; - } - - /** - * Adds Unique Constraint. - * - * @param array $columns - * @param string|null $name - * @param array $options - * @param array $flags - * - * @return ClassMetadataBuilder - */ - public function addUniqueConstraint(array $columns, $name, array $options = [], array $flags = []) - { - if ( ! isset($this->cm->table['uniqueConstraints'])) { - $this->cm->table['uniqueConstraints'] = []; - } - - $index = ['columns' => $columns]; - - if ( ! empty($options)) { - $index['options'] = $options; - } - - if ( ! empty($flags)) { - $index['flags'] = $flags; - } - - if (!$name) { - $this->cm->table['uniqueConstraints'][] = $index; - - return $this; - } - - $this->cm->table['uniqueConstraints'][$name] = $index; - - return $this; - - - } - /** * Adds named query. * diff --git a/lib/Doctrine/ORM/Mapping/Builder/TableMetadataBuilder.php b/lib/Doctrine/ORM/Mapping/Builder/TableMetadataBuilder.php new file mode 100644 index 00000000000..56627817943 --- /dev/null +++ b/lib/Doctrine/ORM/Mapping/Builder/TableMetadataBuilder.php @@ -0,0 +1,173 @@ +. + */ + +namespace Doctrine\ORM\Mapping\Builder; + +use Doctrine\ORM\Mapping\DefaultNamingStrategy; +use Doctrine\ORM\Mapping\FieldMetadata; +use Doctrine\ORM\Mapping\NamingStrategy; +use Doctrine\ORM\Mapping\TableMetadata; + +class TableMetadataBuilder implements Builder +{ + /** @var string */ + protected $schema; + + /** @var string */ + protected $name; + + /** @var array */ + protected $options = []; + + /** @var array */ + protected $indexes = []; + + /** @var array */ + protected $uniqueConstraints = []; + + /** + * @param string $name + * + * @return self + */ + public function withName(string $name) + { + $this->name = $name; + + return $this; + } + + /** + * @param string $schema + * + * @return self + */ + public function withSchema(string $schema) + { + $this->schema = $schema; + + return $this; + } + + /** + * @param array $options + * + * @return self + */ + public function withOptions(array $options) + { + $this->options = $options; + + return $this; + } + + /** + * @param string $name + * @param mixed $value + * + * @return self + */ + public function withOption(string $name, $value) + { + $this->options[$name] = $value; + + return $this; + } + + /** + * @param string|null $name + * @param array $columns + * @param bool $unique + * @param array $options + * @param array $flags + * + * @return self + */ + public function withIndex($name, array $columns, bool $unique = false, array $options = [], array $flags = []) + { + $this->indexes[] = [ + 'name' => $name, + 'columns' => $columns, + 'unique' => $unique, + 'options' => $options, + 'flags' => $flags, + ]; + + return $this; + } + + /** + * @param string|null $name + * @param array $columns + * @param array $options + * @param array $flags + * + * @return self + */ + public function withUniqueConstraint($name, array $columns, array $options = [], array $flags = []) + { + $this->uniqueConstraints[] = [ + 'name' => $name, + 'columns' => $columns, + 'options' => $options, + 'flags' => $flags, + ]; + + return $this; + } + + /** + * @return TableMetadata + */ + public function build() + { + $tableMetadata = $this->createMetadataObject(); + + if ($this->name !== null) { + $tableMetadata->setName($this->name); + } + + if ($this->schema !== null) { + $tableMetadata->setSchema($this->schema); + } + + $tableMetadata->setOptions($this->options); + + foreach ($this->indexes as $index) { + $tableMetadata->addIndex($index); + } + + foreach ($this->uniqueConstraints as $constraint) { + $tableMetadata->addUniqueConstraint($constraint); + } + + return $tableMetadata; + } + + /** + * @return TableMetadata + */ + protected function createMetadataObject() + { + return new TableMetadata(); + } +} \ No newline at end of file diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadata.php b/lib/Doctrine/ORM/Mapping/ClassMetadata.php index 1f223c3cb23..319baaace25 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadata.php @@ -407,15 +407,9 @@ class ClassMetadata implements ClassMetadataInterface public $discriminatorColumn; /** - * READ-ONLY: The primary table definition. The definition is an array with the - * following entries: + * READ-ONLY: The primary table metadata. * - * name => - * schema => - * indexes => array - * uniqueConstraints => array - * - * @var array + * @var TableMetadata */ public $table; @@ -573,6 +567,7 @@ public function __construct($entityName, NamingStrategy $namingStrategy = null) { $this->name = $entityName; $this->rootEntityName = $entityName; + $this->table = new TableMetadata(); $this->namingStrategy = $namingStrategy ?: new DefaultNamingStrategy(); $this->instantiator = new Instantiator(); } @@ -891,8 +886,8 @@ public function initializeReflection($reflService) $this->name = $this->rootEntityName = $this->reflClass->getName(); } - if ( ! isset($this->table['name'])) { - $this->table['name'] = $this->namingStrategy->classToTableName($this->name); + if (empty($this->table->getName())) { + $this->table->setName($this->namingStrategy->classToTableName($this->name)); } } @@ -1401,9 +1396,14 @@ protected function validateAndCompleteOneToOneMapping(array $mapping) throw new RuntimeException("ClassMetadata::setTable() has to be called before defining a one to one relationship."); } - $this->table['uniqueConstraints'][$mapping['fieldName'] . "_uniq"] = [ - 'columns' => $uniqueConstraintColumns - ]; + $this->table->addUniqueConstraint( + [ + 'name' => sprintf('%s_uniq', $mapping['fieldName']), + 'columns' => $uniqueConstraintColumns, + 'options' => [], + 'flags' => [], + ] + ); } $mapping['targetToSourceKeyColumns'] = array_flip($mapping['sourceToTargetKeyColumns']); @@ -1786,7 +1786,7 @@ public function isIdentifierUuid() */ public function getTableName() { - return $this->table['name']; + return $this->table->getName(); } /** @@ -1796,7 +1796,7 @@ public function getTableName() */ public function getSchemaName() { - return isset($this->table['schema']) ? $this->table['schema'] : null; + return $this->table->getSchema() ?? null; } /** @@ -1988,45 +1988,15 @@ public function isInheritedProperty($fieldName) } /** - * Sets the primary table definition. The provided array supports the - * following structure: - * - * name => (optional, defaults to class name) - * indexes => array of indexes (optional) - * uniqueConstraints => array of constraints (optional) + * Sets the primary table metadata. * - * If a key is omitted, the current value is kept. - * - * @param array $table The table description. + * @param TableMetadata $tableMetadata * * @return void */ - public function setPrimaryTable(array $table) + public function setPrimaryTable(TableMetadata $tableMetadata) { - if (isset($table['name'])) { - // Split schema and table name from a table name like "myschema.mytable" - if (strpos($table['name'], '.') !== false) { - list($this->table['schema'], $table['name']) = explode('.', $table['name'], 2); - } - - $this->table['name'] = $table['name']; - } - - if (isset($table['schema'])) { - $this->table['schema'] = $table['schema']; - } - - if (isset($table['indexes'])) { - $this->table['indexes'] = $table['indexes']; - } - - if (isset($table['uniqueConstraints'])) { - $this->table['uniqueConstraints'] = $table['uniqueConstraints']; - } - - if (isset($table['options'])) { - $this->table['options'] = $table['options']; - } + $this->table = $tableMetadata; } /** diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 4bde0975133..3ca2860dc96 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -563,18 +563,20 @@ private function addInheritedIndexes(ClassMetadata $subClass, ClassMetadata $par return; } - foreach (['uniqueConstraints', 'indexes'] as $indexType) { - if ( ! isset($parentClass->table[$indexType])) { + foreach ($parentClass->table->getIndexes() as $indexName => $index) { + if ($subClass->table->hasIndex($indexName)) { continue; } - foreach ($parentClass->table[$indexType] as $indexName => $index) { - if (isset($subClass->table[$indexType][$indexName])) { - continue; // Let the inheriting table override indices - } + $subClass->table->addIndex($index); + } - $subClass->table[$indexType][$indexName] = $index; + foreach ($parentClass->table->getUniqueConstraints() as $constraintName => $constraint) { + if ($subClass->table->hasUniqueConstraint($constraintName)) { + continue; } + + $subClass->table->addUniqueConstraint($constraint); } } diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index a04267a8328..addf206b277 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -28,6 +28,7 @@ use Doctrine\ORM\Mapping\Builder\EntityListenerBuilder; use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder; use Doctrine\ORM\Mapping\Builder\DiscriminatorColumnMetadataBuilder; +use Doctrine\ORM\Mapping\Builder\TableMetadataBuilder; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\FieldMetadata; use Doctrine\ORM\Mapping\JoinColumnMetadata; @@ -111,14 +112,28 @@ public function loadMetadataForClass($className, ClassMetadataInterface $metadat // Evaluate Table annotation if (isset($classAnnotations[Annotation\Table::class])) { - $tableAnnot = $classAnnotations[Annotation\Table::class]; + $tableAnnot = $classAnnotations[Annotation\Table::class]; + $tableBuilder = new TableMetadataBuilder(); - $builder->setTable($tableAnnot->name, $tableAnnot->schema, $tableAnnot->options); + if (! empty($tableAnnot->name)) { + $metadata->table->setName($tableAnnot->name); + } + + if (! empty($tableAnnot->schema)) { + $metadata->table->setSchema($tableAnnot->schema); + } + + if (! empty($metadata->table->getSchema())) { + $tableBuilder->withSchema($metadata->table->getSchema()); + } + + $tableBuilder->withName($metadata->table->getName()); + $tableBuilder->withOptions($tableAnnot->options); foreach ($tableAnnot->indexes as $indexAnnot) { - $builder->addIndex( - $indexAnnot->columns, + $tableBuilder->withIndex( $indexAnnot->name, + $indexAnnot->columns, $indexAnnot->unique, $indexAnnot->options, $indexAnnot->flags @@ -126,13 +141,15 @@ public function loadMetadataForClass($className, ClassMetadataInterface $metadat } foreach ($tableAnnot->uniqueConstraints as $uniqueConstraintAnnot) { - $builder->addUniqueConstraint( - $uniqueConstraintAnnot->columns, + $tableBuilder->withUniqueConstraint( $uniqueConstraintAnnot->name, + $uniqueConstraintAnnot->columns, $uniqueConstraintAnnot->options, $uniqueConstraintAnnot->flags ); } + + $builder->withTable($tableBuilder->build()); } // Evaluate @Cache annotation diff --git a/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php b/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php index edb4c0d04cb..1e25878c8ff 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php @@ -28,10 +28,12 @@ use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\Column; use Doctrine\DBAL\Types\Type; +use Doctrine\ORM\Mapping\Builder\TableMetadataBuilder; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\FieldMetadata; use Doctrine\ORM\Mapping\JoinColumnMetadata; use Doctrine\ORM\Mapping\MappingException; +use Doctrine\ORM\Mapping\TableMetadata; /** * The DatabaseDriver reverse engineers the mapping metadata from a database. @@ -181,28 +183,28 @@ public function loadMetadataForClass($className, ClassMetadataInterface $metadat throw new \InvalidArgumentException("Unknown class " . $className); } - $tableName = $this->classToTableNames[$className]; + $metadata->name = $className; + $metadata->table = $this->buildTable($metadata); - $metadata->name = $className; - $metadata->table['name'] = $tableName; - - $this->buildIndexes($metadata); $this->buildFieldMappings($metadata); $this->buildToOneAssociationMappings($metadata); + $loweredTableName = strtolower($metadata->table->getName()); + foreach ($this->manyToManyTables as $manyTable) { foreach ($manyTable->getForeignKeys() as $foreignKey) { // foreign key maps to the table of the current entity, many to many association probably exists - if ( ! (strtolower($tableName) === strtolower($foreignKey->getForeignTableName()))) { + if ( ! ($loweredTableName === strtolower($foreignKey->getForeignTableName()))) { continue; } $myFk = $foreignKey; $otherFk = null; - foreach ($manyTable->getForeignKeys() as $foreignKey) { - if ($foreignKey != $myFk) { - $otherFk = $foreignKey; + foreach ($manyTable->getForeignKeys() as $manyTableForeignKey) { + if ($manyTableForeignKey !== $myFk) { + $otherFk = $manyTableForeignKey; + break; } } @@ -222,13 +224,13 @@ public function loadMetadataForClass($className, ClassMetadataInterface $metadat if (current($manyTable->getColumns())->getName() === $localColumn) { $associationMapping['inversedBy'] = $this->getFieldNameForColumn($manyTable->getName(), current($myFk->getColumns()), true); $associationMapping['joinTable'] = [ - 'name' => strtolower($manyTable->getName()), - 'joinColumns' => [], + 'name' => strtolower($manyTable->getName()), + 'joinColumns' => [], 'inverseJoinColumns' => [], ]; $fkCols = $myFk->getForeignColumns(); - $cols = $myFk->getColumns(); + $cols = $myFk->getColumns(); for ($i = 0, $l = count($cols); $i < $l; $i++) { $joinColumn = new JoinColumnMetadata(); @@ -317,14 +319,19 @@ private function reverseEngineerMappingFromDatabase() } /** - * Build indexes from a class metadata. + * Build table from a class metadata. * * @param ClassMetadata $metadata + * + * @return TableMetadata */ - private function buildIndexes(ClassMetadata $metadata) + private function buildTable(ClassMetadata $metadata) { - $tableName = $metadata->getTableName(); - $indexes = $this->tables[$tableName]->getIndexes(); + $tableName = $this->classToTableNames[$metadata->name]; + $indexes = $this->tables[$tableName]->getIndexes(); + $tableBuilder = new TableMetadataBuilder(); + + $tableBuilder->withName($this->classToTableNames[$metadata->name]); foreach ($indexes as $index) { /** @var Index $index */ @@ -332,15 +339,16 @@ private function buildIndexes(ClassMetadata $metadata) continue; } - $indexName = $index->getName(); - - $metadata->table['indexes'][$indexName] = [ - 'unique' => $index->isUnique(), - 'columns' => $index->getColumns(), - 'options' => $index->getOptions(), - 'flags' => $index->getFlags(), - ]; + $tableBuilder->withIndex( + $index->getName(), + $index->getColumns(), + $index->isUnique(), + $index->getOptions(), + $index->getFlags() + ); } + + return $tableBuilder->build(); } /** diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index 007bee72a97..f44bb5a14e0 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -23,6 +23,7 @@ use Doctrine\Common\Persistence\Mapping\Driver\FileDriver; use Doctrine\DBAL\Types\Type; use Doctrine\ORM\Mapping\Builder\DiscriminatorColumnMetadataBuilder; +use Doctrine\ORM\Mapping\Builder\TableMetadataBuilder; use Doctrine\ORM\Mapping\Builder\EntityListenerBuilder; use Doctrine\ORM\Mapping\FieldMetadata; use Doctrine\ORM\Mapping\JoinColumnMetadata; @@ -81,17 +82,54 @@ public function loadMetadataForClass($className, ClassMetadata $metadata) } // Evaluate attributes - $primaryTable = []; + $tableBuilder = new TableMetadataBuilder(); if (isset($xmlRoot['table'])) { - $primaryTable['name'] = (string) $xmlRoot['table']; + $metadata->table->setName((string) $xmlRoot['table']); } if (isset($xmlRoot['schema'])) { - $primaryTable['schema'] = (string) $xmlRoot['schema']; + $metadata->table->setSchema((string) $xmlRoot['schema']); } - $metadata->setPrimaryTable($primaryTable); + if (isset($xmlRoot->options)) { + $options = $this->parseOptions($xmlRoot->options->children()); + + $tableBuilder->withOptions($options); + } + + if (! empty($metadata->table->getSchema())) { + $tableBuilder->withSchema($metadata->table->getSchema()); + } + + $tableBuilder->withName($metadata->table->getName()); + + // Evaluate + if (isset($xmlRoot->indexes)) { + foreach ($xmlRoot->indexes->index as $indexXml) { + $indexName = isset($indexXml['name']) ? (string) $indexXml['name'] : null; + $columns = explode(',', (string) $indexXml['columns']); + $isUnique = isset($indexXml['unique']) && $indexXml['unique']; + $options = isset($indexXml->options) ? $this->parseOptions($indexXml->options->children()) : []; + $flags = isset($indexXml['flags']) ? explode(',', (string) $indexXml['flags']) : []; + + $tableBuilder->withIndex($indexName, $columns, $isUnique, $options, $flags); + } + } + + // Evaluate + if (isset($xmlRoot->{'unique-constraints'})) { + foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} as $uniqueXml) { + $indexName = isset($uniqueXml['name']) ? (string) $uniqueXml['name'] : null; + $columns = explode(',', (string) $uniqueXml['columns']); + $options = isset($uniqueXml->options) ? $this->parseOptions($uniqueXml->options->children()) : []; + $flags = isset($uniqueXml['flags']) ? explode(',', (string) $uniqueXml['flags']) : []; + + $tableBuilder->withUniqueConstraint($indexName, $columns, $options, $flags); + } + } + + $metadata->setPrimaryTable($tableBuilder->build()); // Evaluate second level cache if (isset($xmlRoot->cache)) { @@ -224,58 +262,6 @@ public function loadMetadataForClass($className, ClassMetadata $metadata) ); } - // Evaluate - if (isset($xmlRoot->indexes)) { - $metadata->table['indexes'] = []; - - foreach ($xmlRoot->indexes->index as $indexXml) { - $index = [ - 'unique' => isset($indexXml['unique']) && $indexXml['unique'], - 'columns' => explode(',', (string) $indexXml['columns']) - ]; - - if (isset($indexXml['flags'])) { - $index['flags'] = explode(',', (string) $indexXml['flags']); - } - - if (isset($indexXml->options)) { - $index['options'] = $this->parseOptions($indexXml->options->children()); - } - - if (isset($indexXml['name'])) { - $metadata->table['indexes'][(string) $indexXml['name']] = $index; - } else { - $metadata->table['indexes'][] = $index; - } - } - } - - // Evaluate - if (isset($xmlRoot->{'unique-constraints'})) { - $metadata->table['uniqueConstraints'] = []; - foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} as $uniqueXml) { - $unique = ['columns' => explode(',', (string) $uniqueXml['columns'])]; - - if (isset($uniqueXml->options)) { - $unique['options'] = $this->parseOptions($uniqueXml->options->children()); - } - - if (isset($uniqueXml['flags'])) { - $unique['flags'] = explode(',', (string) $uniqueXml['flags']); - } - - if (isset($uniqueXml['name'])) { - $metadata->table['uniqueConstraints'][(string) $uniqueXml['name']] = $unique; - } else { - $metadata->table['uniqueConstraints'][] = $unique; - } - } - } - - if (isset($xmlRoot->options)) { - $metadata->table['options'] = $this->parseOptions($xmlRoot->options->children()); - } - // Evaluate mappings if (isset($xmlRoot->field)) { foreach ($xmlRoot->field as $fieldElement) { diff --git a/lib/Doctrine/ORM/Mapping/FieldMetadata.php b/lib/Doctrine/ORM/Mapping/FieldMetadata.php index ee3d814f525..cc2549ec245 100644 --- a/lib/Doctrine/ORM/Mapping/FieldMetadata.php +++ b/lib/Doctrine/ORM/Mapping/FieldMetadata.php @@ -31,27 +31,27 @@ class FieldMetadata extends ColumnMetadata implements Property /** * @var ClassMetadata */ - private $declaringClass; + protected $declaringClass; /** * @var \ReflectionProperty */ - private $reflection; + protected $reflection; /** * @var string */ - private $name; + protected $name; /** * @var int */ - private $identifierGeneratorType = ClassMetadata::GENERATOR_TYPE_NONE; + protected $identifierGeneratorType = ClassMetadata::GENERATOR_TYPE_NONE; /** * @var array */ - private $identifierGeneratorDefinition = []; + protected $identifierGeneratorDefinition = []; /** * FieldMetadata constructor. diff --git a/lib/Doctrine/ORM/Mapping/JoinColumnMetadata.php b/lib/Doctrine/ORM/Mapping/JoinColumnMetadata.php index 3349b56b7b9..588e0d0de30 100644 --- a/lib/Doctrine/ORM/Mapping/JoinColumnMetadata.php +++ b/lib/Doctrine/ORM/Mapping/JoinColumnMetadata.php @@ -25,16 +25,16 @@ class JoinColumnMetadata extends ColumnMetadata { /** @var string */ - private $referencedColumnName; + protected $referencedColumnName; /** @var string */ - private $aliasedName; + protected $aliasedName; /** @var boolean */ protected $nullable = true; /** @var string */ - private $onDelete = ''; + protected $onDelete = ''; /** * @return string diff --git a/lib/Doctrine/ORM/Mapping/JoinTableMetadata.php b/lib/Doctrine/ORM/Mapping/JoinTableMetadata.php index 44d8e0a4f54..3587e937d59 100644 --- a/lib/Doctrine/ORM/Mapping/JoinTableMetadata.php +++ b/lib/Doctrine/ORM/Mapping/JoinTableMetadata.php @@ -1,5 +1,7 @@ . + */ + +namespace Doctrine\ORM\Mapping; + +class TableMetadata +{ + /** @var string */ + protected $schema; + + /** @var string */ + protected $name; + + /** @var array */ + protected $options = []; + + /** @var array */ + protected $indexes = []; + + /** @var array */ + protected $uniqueConstraints = []; + + /** + * @param string $name + */ + public function setName(string $name) + { + $this->name = $name; + } + + /** + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * @return string + */ + public function getSchema() + { + return $this->schema; + } + + /** + * @param string $schema + */ + public function setSchema(string $schema) + { + $this->schema = $schema; + } + + /** + * @return array + */ + public function getOptions() + { + return $this->options; + } + + /** + * @param array $options + */ + public function setOptions(array $options) + { + $this->options = $options; + } + + /** + * @param string $name + * + * @return mixed + */ + public function getOption(string $name) + { + return $this->options[$name]; + } + + /** + * @param string $name + * + * @return bool + */ + public function hasOption(string $name) + { + return isset($this->options[$name]); + } + + /** + * @param string $name + * @param mixed $value + */ + public function addOption(string $name, $value) + { + $this->options[$name] = $value; + } + + /** + * @return array + */ + public function getIndexes() + { + return $this->indexes; + } + + /** + * @param string $name + * + * @return array + */ + public function getIndex(string $name) + { + return $this->indexes[$name]; + } + + /** + * @param string $name + * + * @return bool + */ + public function hasIndex(string $name) + { + return isset($this->indexes[$name]); + } + + /** + * @param array $index + */ + public function addIndex(array $index) + { + if (! isset($index['name'])) { + $this->indexes[] = $index; + + return; + } + + $this->indexes[$index['name']] = $index; + } + + /** + * @return array + */ + public function getUniqueConstraints() + { + return $this->uniqueConstraints; + } + + /** + * @param string $name + * + * @return array + */ + public function getUniqueConstraint(string $name) + { + return $this->uniqueConstraints[$name]; + } + + /** + * @param string $name + * + * @return bool + */ + public function hasUniqueConstraint(string $name) + { + return isset($this->uniqueConstraints[$name]); + } + + /** + * @param array $constraint + */ + public function addUniqueConstraint(array $constraint) + { + if (! isset($constraint['name'])) { + $this->uniqueConstraints[] = $constraint; + + return; + } + + $this->uniqueConstraints[$constraint['name']] = $constraint; + } +} \ No newline at end of file diff --git a/lib/Doctrine/ORM/Mapping/VersionFieldMetadata.php b/lib/Doctrine/ORM/Mapping/VersionFieldMetadata.php index 2194dcb6ae6..c70313940e1 100644 --- a/lib/Doctrine/ORM/Mapping/VersionFieldMetadata.php +++ b/lib/Doctrine/ORM/Mapping/VersionFieldMetadata.php @@ -1,4 +1,7 @@ formatField('Discriminator map', $metadata->discriminatorMap), $this->formatField('Generator type', $metadata->generatorType), $this->formatField('Generator definition', $metadata->generatorDefinition), - $this->formatField('Table', $metadata->table), + $this->formatField('Table', ''), + ], + $this->formatTable($metadata->table), + [ $this->formatField('Composite identifier?', $metadata->isIdentifierComposite), $this->formatField('Foreign identifier?', $metadata->containsForeignIdentifier), $this->formatField('Change tracking policy', $metadata->changeTrackingPolicy), @@ -311,6 +315,7 @@ private function formatColumn(ColumnMetadata $columnMetadata = null) $output[] = $this->formatField(' isPrimaryKey', $this->formatValue($columnMetadata->isPrimaryKey())); $output[] = $this->formatField(' isNullable', $this->formatValue($columnMetadata->isNullable())); $output[] = $this->formatField(' isUnique', $this->formatValue($columnMetadata->isUnique())); + $output[] = $this->formatField(' options', $this->formatValue($columnMetadata->getOptions())); return $output; } @@ -326,4 +331,28 @@ private function formatEntityListeners(array $entityListeners) { return $this->formatField('Entity listeners', array_map('get_class', $entityListeners)); } + + /** + * @param TableMetadata|null $tableMetadata + * + * @return array|string + */ + private function formatTable(TableMetadata $tableMetadata = null) + { + $output = []; + + if (null === $tableMetadata) { + $output[] = 'Null'; + + return $output; + } + + $output[] = $this->formatField(' schema', $this->formatValue($tableMetadata->getSchema())); + $output[] = $this->formatField(' name', $this->formatValue($tableMetadata->getName())); + $output[] = $this->formatField(' indexes', $this->formatValue($tableMetadata->getIndexes())); + $output[] = $this->formatField(' uniqueConstaints', $this->formatValue($tableMetadata->getUniqueConstraints())); + $output[] = $this->formatField(' options', $this->formatValue($tableMetadata->getOptions())); + + return $output; + } } diff --git a/lib/Doctrine/ORM/Tools/EntityGenerator.php b/lib/Doctrine/ORM/Tools/EntityGenerator.php index c3e879440b0..330c4693603 100644 --- a/lib/Doctrine/ORM/Tools/EntityGenerator.php +++ b/lib/Doctrine/ORM/Tools/EntityGenerator.php @@ -1072,25 +1072,25 @@ protected function generateTableAnnotation(ClassMetadata $metadata) $table = []; - if (isset($metadata->table['schema'])) { - $table[] = 'schema="' . $metadata->table['schema'] . '"'; + if ($metadata->table->getSchema()) { + $table[] = 'schema="' . $metadata->table->getSchema() . '"'; } - if (isset($metadata->table['name'])) { - $table[] = 'name="' . $metadata->table['name'] . '"'; + if ($metadata->table->getName()) { + $table[] = 'name="' . $metadata->table->getName() . '"'; } - if (isset($metadata->table['options']) && $metadata->table['options']) { - $table[] = 'options={' . $this->exportTableOptions((array) $metadata->table['options']) . '}'; + if ($metadata->table->getOptions()) { + $table[] = 'options={' . $this->exportTableOptions($metadata->table->getOptions()) . '}'; } - if (isset($metadata->table['uniqueConstraints']) && $metadata->table['uniqueConstraints']) { - $constraints = $this->generateTableConstraints('UniqueConstraint', $metadata->table['uniqueConstraints']); + if ($metadata->table->getUniqueConstraints()) { + $constraints = $this->generateTableConstraints('UniqueConstraint', $metadata->table->getUniqueConstraints()); $table[] = 'uniqueConstraints={' . $constraints . '}'; } - if (isset($metadata->table['indexes']) && $metadata->table['indexes']) { - $constraints = $this->generateTableConstraints('Index', $metadata->table['indexes']); + if ($metadata->table->getIndexes()) { + $constraints = $this->generateTableConstraints('Index', $metadata->table->getIndexes()); $table[] = 'indexes={' . $constraints . '}'; } diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php index 8dca3b2e8ac..4783d478cdf 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php @@ -63,7 +63,28 @@ public function exportClassMetadata(ClassMetadata $metadata) } if ($metadata->table) { - $lines[] = '$metadata->setPrimaryTable(' . $this->_varExport($metadata->table) . ');'; + $table = $metadata->table; + + $lines[] = '$table = new Mapping\TableMetadata();'; + $lines[] = null; + + if (! empty($table->getSchema())) { + $lines[] = '$table->setSchema(' . $table->getSchema() . ');'; + } + + $lines[] = '$table->setName("' . $table->getName() . '");'; + $lines[] = '$table->setOptions(' . $this->_varExport($table->getOptions()) . ');'; + + foreach ($table->getIndexes() as $index) { + $lines[] = '$table->addIndex(' . $this->_varExport($index) . ');'; + } + + foreach ($table->getUniqueConstraints() as $constraint) { + $lines[] = '$table->addUniqueConstraint(' . $this->_varExport($constraint) . ');'; + } + + $lines[] = null; + $lines[] = '$metadata->setPrimaryTable($table);'; } if ($metadata->discriminatorColumn) { diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php index 90353fc6282..39f0048fbe1 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/XmlExporter.php @@ -59,22 +59,22 @@ public function exportClassMetadata(ClassMetadata $metadata) $root->addAttribute('name', $metadata->name); - if (isset($metadata->table['name'])) { - $root->addAttribute('table', $metadata->table['name']); + if ($metadata->table->getName()) { + $root->addAttribute('table', $metadata->table->getName()); } - if (isset($metadata->table['schema'])) { - $root->addAttribute('schema', $metadata->table['schema']); + if ($metadata->table->getSchema()) { + $root->addAttribute('schema', $metadata->table->getSchema()); } if ($metadata->inheritanceType && $metadata->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { $root->addAttribute('inheritance-type', $this->_getInheritanceTypeString($metadata->inheritanceType)); } - if (isset($metadata->table['options'])) { + if ($metadata->table->getOptions()) { $optionsXml = $root->addChild('options'); - $this->exportTableOptions($optionsXml, $metadata->table['options']); + $this->exportTableOptions($optionsXml, $metadata->table->getOptions()); } if ($metadata->discriminatorColumn) { @@ -113,20 +113,20 @@ public function exportClassMetadata(ClassMetadata $metadata) $root->addChild('change-tracking-policy', $trackingPolicy); } - if (isset($metadata->table['indexes'])) { + if ($metadata->table->getIndexes()) { $indexesXml = $root->addChild('indexes'); - foreach ($metadata->table['indexes'] as $name => $index) { + foreach ($metadata->table->getIndexes() as $name => $index) { $indexXml = $indexesXml->addChild('index'); + $indexXml->addAttribute('name', $name); + $indexXml->addAttribute('columns', implode(',', $index['columns'])); if ($index['unique']) { $indexXml->addAttribute('unique', 'true'); } - $indexXml->addAttribute('columns', implode(',', $index['columns'])); - - if (isset($index['flags'])) { + if ($index['flags']) { $indexXml->addAttribute('flags', implode(',', $index['flags'])); } @@ -142,19 +142,23 @@ public function exportClassMetadata(ClassMetadata $metadata) } } - if (isset($metadata->table['uniqueConstraints'])) { + if ($metadata->table->getUniqueConstraints()) { $uniqueConstraintsXml = $root->addChild('unique-constraints'); - foreach ($metadata->table['uniqueConstraints'] as $name => $unique) { + foreach ($metadata->table->getUniqueConstraints() as $name => $constraint) { $uniqueConstraintXml = $uniqueConstraintsXml->addChild('unique-constraint'); $uniqueConstraintXml->addAttribute('name', $name); - $uniqueConstraintXml->addAttribute('columns', implode(',', $unique['columns'])); + $uniqueConstraintXml->addAttribute('columns', implode(',', $constraint['columns'])); + + if ($constraint['flags']) { + $uniqueConstraintXml->addAttribute('flags', implode(',', $constraint['flags'])); + } - if ($unique['options']) { + if ($constraint['options']) { $optionsXml = $uniqueConstraintXml->addChild('options'); - foreach ($unique['options'] as $key => $value) { + foreach ($constraint['options'] as $key => $value) { $optionXml = $optionsXml->addChild('option', $value); $optionXml->addAttribute('name', $key); diff --git a/lib/Doctrine/ORM/Tools/SchemaTool.php b/lib/Doctrine/ORM/Tools/SchemaTool.php index f9933bcd628..1d03d135184 100644 --- a/lib/Doctrine/ORM/Tools/SchemaTool.php +++ b/lib/Doctrine/ORM/Tools/SchemaTool.php @@ -304,15 +304,10 @@ function (ClassMetadata $class) use ($idMapping) : bool { } } - if (isset($class->table['indexes'])) { - foreach ($class->table['indexes'] as $indexName => $indexData) { + if ($class->table->getIndexes()) { + foreach ($class->table->getIndexes() as $indexName => $indexData) { $indexName = is_numeric($indexName) ? null : $indexName; - - if ( ! isset($indexData['flags'])) { - $indexData['flags'] = []; - } - - $index = new Index($indexName, $indexData['columns'], $indexData['unique'], $indexData['flags'], $indexData['options'] ?? []); + $index = new Index($indexName, $indexData['columns'], $indexData['unique'], $indexData['flags'], $indexData['options']); foreach ($table->getIndexes() as $tableIndexName => $tableIndex) { if ($tableIndex->isFullfilledBy($index)) { @@ -322,18 +317,17 @@ function (ClassMetadata $class) use ($idMapping) : bool { } if ($indexData['unique']) { - $table->addUniqueIndex($indexData['columns'], $indexName, (array) $indexData['options']); + $table->addUniqueIndex($indexData['columns'], $indexName, $indexData['options']); } else { - $table->addIndex($indexData['columns'], $indexName, (array) $indexData['flags'], (array) $indexData['options']); + $table->addIndex($indexData['columns'], $indexName, $indexData['flags'], $indexData['options']); } } } - if (isset($class->table['uniqueConstraints'])) { - foreach ($class->table['uniqueConstraints'] as $indexName => $indexData) { - $flags = isset($indexData['flags']) ? $indexData['flags'] : []; - $options = isset($indexData['options']) ? $indexData['options'] : []; - $uniqIndex = new Index($indexName, $indexData['columns'], true, false, $flags, $options); + if ($class->table->getUniqueConstraints()) { + foreach ($class->table->getUniqueConstraints() as $indexName => $indexData) { + $indexName = is_numeric($indexName) ? null : $indexName; + $uniqIndex = new Index($indexName, $indexData['columns'], true, false, $indexData['flags'], $indexData['options']); foreach ($table->getIndexes() as $tableIndexName => $tableIndex) { if ($tableIndex->isFullfilledBy($uniqIndex)) { @@ -342,12 +336,12 @@ function (ClassMetadata $class) use ($idMapping) : bool { } } - $table->addUniqueConstraint($indexData['columns'], is_numeric($indexName) ? null : $indexName, $flags, $options); + $table->addUniqueConstraint($indexData['columns'], $indexName, $indexData['flags'], $indexData['options']); } } - if (isset($class->table['options'])) { - foreach ($class->table['options'] as $key => $val) { + if ($class->table->getOptions()) { + foreach ($class->table->getOptions() as $key => $val) { $table->addOption($key, $val); } } diff --git a/tests/Doctrine/Tests/Models/CMS/CmsAddress.php b/tests/Doctrine/Tests/Models/CMS/CmsAddress.php index 315906f4e3b..50a2770c5c5 100644 --- a/tests/Doctrine/Tests/Models/CMS/CmsAddress.php +++ b/tests/Doctrine/Tests/Models/CMS/CmsAddress.php @@ -127,7 +127,10 @@ public function setUser(CmsUser $user) { public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { - $metadata->setPrimaryTable(['name' => 'company_person']); + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('company_person'); + + $metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('id'); diff --git a/tests/Doctrine/Tests/Models/CMS/CmsUser.php b/tests/Doctrine/Tests/Models/CMS/CmsUser.php index 95fa71e17af..aa019698781 100644 --- a/tests/Doctrine/Tests/Models/CMS/CmsUser.php +++ b/tests/Doctrine/Tests/Models/CMS/CmsUser.php @@ -3,6 +3,7 @@ namespace Doctrine\Tests\Models\CMS; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\ORM\Mapping; /** * @Entity @@ -271,11 +272,10 @@ public function setEmail(CmsEmail $email = null) { public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { - $metadata->setPrimaryTable( - [ - 'name' => 'cms_users', - ] - ); + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('cms_users'); + + $metadata->setPrimaryTable($tableMetadata); $metadata->addNamedNativeQuery( [ diff --git a/tests/Doctrine/Tests/Models/Company/CompanyContract.php b/tests/Doctrine/Tests/Models/Company/CompanyContract.php index bea51a515ec..91589495488 100644 --- a/tests/Doctrine/Tests/Models/Company/CompanyContract.php +++ b/tests/Doctrine/Tests/Models/Company/CompanyContract.php @@ -135,8 +135,11 @@ abstract public function calculatePrice(); static public function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { - $metadata->setInheritanceType(\Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_JOINED); - $metadata->setPrimaryTable(['name' => 'company_contracts']); + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('company_contracts'); + + $metadata->setPrimaryTable($tableMetadata); + $metadata->setInheritanceType(Mapping\ClassMetadata::INHERITANCE_TYPE_JOINED); $discrColumn = new Mapping\DiscriminatorColumnMetadata(); diff --git a/tests/Doctrine/Tests/Models/Company/CompanyPerson.php b/tests/Doctrine/Tests/Models/Company/CompanyPerson.php index 8592e375150..e720d7aaff2 100644 --- a/tests/Doctrine/Tests/Models/Company/CompanyPerson.php +++ b/tests/Doctrine/Tests/Models/Company/CompanyPerson.php @@ -2,6 +2,8 @@ namespace Doctrine\Tests\Models\Company; +use Doctrine\ORM\Mapping; + /** * Description of CompanyPerson * @@ -119,12 +121,10 @@ public function setSpouse(CompanyPerson $spouse) { public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('company_person'); - $metadata->setPrimaryTable( - [ - 'name' => 'company_person', - ] - ); + $metadata->setPrimaryTable($tableMetadata); $metadata->addNamedNativeQuery( [ diff --git a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php index d1caee880d0..d9ec1ee4f46 100644 --- a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php +++ b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php @@ -13,10 +13,12 @@ class ExplicitSchemaAndTable public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { - $metadata->setPrimaryTable(array( - 'name' => 'explicit_table', - 'schema' => 'explicit_schema', - )); + $tableMetadata = new Mapping\TableMetadata(); + + $tableMetadata->setSchema('explicit_schema'); + $tableMetadata->setName('explicit_table'); + + $metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('id'); diff --git a/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php index 6e0b942f08a..cbc486c4d67 100644 --- a/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php +++ b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php @@ -9,18 +9,25 @@ * Quoted column name to check that sequence names are * correctly handled * - * @Entity @Table(name="implicit_schema.implicit_table") + * @Entity + * @Table(name="implicit_table", schema="implicit_schema") */ class SchemaAndTableInTableName { - /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ + /** + * @Id @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ public $id; public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadata $metadata) { - $metadata->setPrimaryTable(array( - 'name' => 'implicit_schema.implicit_table', - )); + $tableMetadata = new Mapping\TableMetadata(); + + $tableMetadata->setName('implicit_table'); + $tableMetadata->setSchema('implicit_schema'); + + $metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('id'); diff --git a/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php b/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php index 28b0e74cb11..26459733779 100644 --- a/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/DatabaseDriverTest.php @@ -215,7 +215,7 @@ public function testLoadMetadataFromDatabaseDetail() // Check comment self::assertNotNull($metadata->getProperty('columnComment')); - + $columnCommentProperty = $metadata->getProperty('columnComment'); $columnCommentOptions = $columnCommentProperty->getOptions(); @@ -240,16 +240,21 @@ public function testLoadMetadataFromDatabaseDetail() self::assertEquals(3, $columnDecimalProperty->getScale()); // Check indexes - self::assertTrue( ! empty($metadata->table['indexes']['index1']['columns'])); + $indexes = $metadata->table->getIndexes(); + + self::assertTrue( ! empty($indexes['index1']['columns'])); self::assertEquals( ['column_index1','column_index2'], - $metadata->table['indexes']['index1']['columns'] + $indexes['index1']['columns'] ); - self::assertTrue( ! empty($metadata->table['uniqueConstraints']['unique_index1']['columns'])); + // Check unique constraints + $uniqueConstraints = $metadata->table->getUniqueConstraints(); + + self::assertTrue( ! empty($uniqueConstraints['unique_index1']['columns'])); self::assertEquals( ['column_unique_index1', 'column_unique_index2'], - $metadata->table['uniqueConstraints']['unique_index1']['columns'] + $uniqueConstraints['unique_index1']['columns'] ); } } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index 7fade168ac8..f35f74a6f4c 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -41,8 +41,8 @@ public function testClassSchemaMappingsValidity($className, $expectedSchemaName, $quotedTableName = $this->_em->getConfiguration()->getQuoteStrategy()->getTableName($classMetadata, $platform); // Check if table name and schema properties are defined in the class metadata - self::assertEquals($expectedTableName, $classMetadata->table['name']); - self::assertEquals($expectedSchemaName, $classMetadata->table['schema']); + self::assertEquals($expectedTableName, $classMetadata->table->getName()); + self::assertEquals($expectedSchemaName, $classMetadata->table->getSchema()); if ($platform->supportsSchemas()) { $fullTableName = sprintf('"%s"."%s"', $expectedSchemaName, $expectedTableName); diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index 74c1ac10cd6..6fff92c4248 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -88,19 +88,25 @@ public function testEntityIndexes() { $class = $this->createClassMetadata('Doctrine\Tests\ORM\Mapping\User'); - self::assertArrayHasKey('indexes', $class->table, 'ClassMetadata should have indexes key in table property.'); + self::assertCount(2, $class->table->getIndexes()); self::assertEquals( [ 'name_idx' => [ + 'name' => 'name_idx', 'columns' => ['name'], 'unique' => false, + 'options' => [], + 'flags' => [], ], 0 => [ + 'name' => null, 'columns' => ['user_email'], 'unique' => false, + 'options' => [], + 'flags' => [], ] ], - $class->table['indexes'] + $class->table->getIndexes() ); return $class; @@ -113,13 +119,14 @@ public function testEntityIndexFlagsAndPartialIndexes() self::assertEquals( [ 0 => [ - 'unique' => false, + 'name' => null, 'columns' => ['content'], + 'unique' => false, 'flags' => ['fulltext'], 'options' => ['where' => 'content IS NOT NULL'], ] ], - $class->table['indexes'] + $class->table->getIndexes() ); } @@ -129,20 +136,17 @@ public function testEntityIndexFlagsAndPartialIndexes() */ public function testEntityUniqueConstraints($class) { - self::assertArrayHasKey( - 'uniqueConstraints', - $class->table, - 'ClassMetadata should have uniqueConstraints key in table property when Unique Constraints are set.' - ); - + self::assertCount(1, $class->table->getUniqueConstraints()); self::assertEquals( [ 'search_idx' => [ + 'name' => 'search_idx', 'columns' => ['name', 'user_email'], - 'options' => ['where' => 'name IS NOT NULL'] + 'options' => [], + 'flags' => [], ] ], - $class->table['uniqueConstraints'] + $class->table->getUniqueConstraints() ); return $class; @@ -154,14 +158,13 @@ public function testEntityUniqueConstraints($class) */ public function testEntityOptions($class) { - self::assertArrayHasKey('options', $class->table, 'ClassMetadata should have options key in table property.'); - + self::assertCount(2, $class->table->getOptions()); self::assertEquals( [ 'foo' => 'bar', 'baz' => ['key' => 'val'] ], - $class->table['options'] + $class->table->getOptions() ); return $class; @@ -577,7 +580,7 @@ public function testNamingStrategy() self::assertEquals('ID', $class->getColumnName('id')); self::assertEquals('NAME', $class->getColumnName('name')); - self::assertEquals('DDC1476ENTITY_WITH_DEFAULT_FIELD_TYPE', $class->table['name']); + self::assertEquals('DDC1476ENTITY_WITH_DEFAULT_FIELD_TYPE', $class->table->getName()); } /** @@ -1141,7 +1144,7 @@ public function testDiscriminatorColumnDefaultName() * @HasLifecycleCallbacks * @Table( * name="cms_users", - * uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "user_email"}, options={"where": "name IS NOT NULL"})}, + * uniqueConstraints={@UniqueConstraint(name="search_idx", columns={"name", "user_email"})}, * indexes={@Index(name="name_idx", columns={"name"}), @Index(name="0", columns={"user_email"})}, * options={"foo": "bar", "baz": {"key": "val"}} * ) @@ -1218,23 +1221,62 @@ public function doStuffOnPostPersist() public static function loadMetadata(ClassMetadata $metadata) { - $metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); - $metadata->setPrimaryTable( + $tableMetadata = new Mapping\TableMetadata(); + + $tableMetadata->setName('cms_users'); + $tableMetadata->addIndex( [ - 'name' => 'cms_users', - 'options' => [ - 'foo' => 'bar', - 'baz' => ['key' => 'val'] - ], + 'name' => 'name_idx', + 'columns' => ['name'], + 'unique' => false, + 'options' => [], + 'flags' => [], ] ); + $tableMetadata->addIndex( + [ + 'name' => null, + 'columns' => ['user_email'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] + ); + + $tableMetadata->addUniqueConstraint( + [ + 'name' => 'search_idx', + 'columns' => ['name', 'user_email'], + 'options' => [], + 'flags' => [], + ] + ); + $tableMetadata->addOption('foo', 'bar'); + $tableMetadata->addOption('baz', ['key' => 'val']); + + $metadata->setPrimaryTable($tableMetadata); + $metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); $metadata->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_IMPLICIT); $metadata->addLifecycleCallback('doStuffOnPrePersist', 'prePersist'); $metadata->addLifecycleCallback('doOtherStuffOnPrePersistToo', 'prePersist'); $metadata->addLifecycleCallback('doStuffOnPostPersist', 'postPersist'); + $metadata->setGeneratorDefinition( + [ + 'sequenceName' => 'tablename_seq', + 'allocationSize' => 100, + ] + ); + + $metadata->addNamedQuery( + [ + 'name' => 'all', + 'query' => 'SELECT u FROM __CLASS__ u' + ] + ); + $fieldMetadata = new Mapping\FieldMetadata('id'); $fieldMetadata->setType(Type::getType('integer')); $fieldMetadata->setPrimaryKey(true); @@ -1341,31 +1383,6 @@ public static function loadMetadata(ClassMetadata $metadata) 'orderBy' => NULL, ] ); - - $metadata->table['indexes'] = [ - 'name_idx' => [ - 'unique' => false, - 'columns' => ['name'], - ], - 0 => [ // Unnamed index - 'unique' => false, - 'columns' => ['user_email'], - ], - ]; - - $metadata->setGeneratorDefinition( - [ - 'sequenceName' => 'tablename_seq', - 'allocationSize' => 100, - ] - ); - - $metadata->addNamedQuery( - [ - 'name' => 'all', - 'query' => 'SELECT u FROM __CLASS__ u' - ] - ); } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php index e6ac8ce8107..498d01d3d03 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php @@ -212,9 +212,9 @@ public function testMappedSuperclassIndex() $class = $this->cmf->getMetadataFor(EntityIndexSubClass::class); self::assertNotNull($class->getProperty('mapped1')); - self::assertArrayHasKey('IDX_NAME_INDEX', $class->table['uniqueConstraints']); - self::assertArrayHasKey('IDX_MAPPED1_INDEX', $class->table['uniqueConstraints']); - self::assertArrayHasKey('IDX_MAPPED2_INDEX', $class->table['indexes']); + self::assertArrayHasKey('IDX_NAME_INDEX', $class->table->getUniqueConstraints()); + self::assertArrayHasKey('IDX_MAPPED1_INDEX', $class->table->getUniqueConstraints()); + self::assertArrayHasKey('IDX_MAPPED2_INDEX', $class->table->getIndexes()); } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php b/tests/Doctrine/Tests/ORM/Mapping/Builder/ClassMetadataBuilderTest.php similarity index 94% rename from tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php rename to tests/Doctrine/Tests/ORM/Mapping/Builder/ClassMetadataBuilderTest.php index 484e3bdee50..3be823496ac 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/Builder/ClassMetadataBuilderTest.php @@ -1,6 +1,6 @@ cm->isReadOnly); } - public function testSetTable() - { - self::assertIsFluent($this->builder->setTable('users')); - self::assertEquals('users', $this->cm->table['name']); - } - - public function testAddIndex() - { - self::assertIsFluent($this->builder->addIndex(array('username', 'name'), 'users_idx')); - self::assertEquals( - [ - 'users_idx' => [ - 'unique' => false, - 'columns' => ['username', 'name'] - ] - ], - $this->cm->table['indexes'] - ); - } - - public function testAddUniqueConstraint() - { - self::assertIsFluent($this->builder->addUniqueConstraint(['username', 'name'], 'users_idx')); - self::assertEquals( - [ - 'users_idx' => [ - 'columns' => ['username', 'name'] - ] - ], - $this->cm->table['uniqueConstraints'] - ); - } - - public function testSetPrimaryTableRelated() - { - $this->builder->addUniqueConstraint(['username', 'name'], 'users_idx'); - $this->builder->addIndex(['username', 'name'], 'users_idx'); - $this->builder->setTable('users'); - - self::assertEquals( - [ - 'name' => 'users', - 'indexes' => [ - 'users_idx' => [ - 'unique' => false, - 'columns' => ['username', 'name'] - ] - ], - 'uniqueConstraints' => [ - 'users_idx' => [ - 'columns' => ['username', 'name'] - ] - ], - 'options' => [], - ], - $this->cm->table - ); - } - public function testSetInheritanceJoined() { self::assertIsFluent($this->builder->setJoinedTableInheritance()); diff --git a/tests/Doctrine/Tests/ORM/Mapping/Builder/TableMetadataBuilderTest.php b/tests/Doctrine/Tests/ORM/Mapping/Builder/TableMetadataBuilderTest.php new file mode 100644 index 00000000000..ba47aeb61e3 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/Builder/TableMetadataBuilderTest.php @@ -0,0 +1,143 @@ +. + */ + +namespace Doctrine\Tests\ORM\Mapping\Builder; + +use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService; +use Doctrine\DBAL\Types\Type; +use Doctrine\ORM\Mapping\Builder\DiscriminatorColumnMetadataBuilder; +use Doctrine\ORM\Mapping\Builder\TableMetadataBuilder; +use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder; +use Doctrine\Tests\OrmTestCase; + +/** + * @group DDC-659 + */ +class TableMetadataBuilderTest extends OrmTestCase +{ + /** + * @var TableMetadataBuilder + */ + private $builder; + + public function setUp() + { + $this->builder = new TableMetadataBuilder(); + } + + public function testWithSchema() + { + self::assertIsFluent($this->builder->withSchema('public')); + + $tableMetadata = $this->builder->build(); + + self::assertEquals('public', $tableMetadata->getSchema()); + } + + + public function testWithName() + { + self::assertIsFluent($this->builder->withName('users')); + + $tableMetadata = $this->builder->build(); + + self::assertEquals('users', $tableMetadata->getName()); + } + + public function testWithIndex() + { + self::assertIsFluent($this->builder->withIndex('users_idx', ['username', 'name'])); + + $tableMetadata = $this->builder->build(); + + self::assertEquals( + [ + 'users_idx' => [ + 'name' => 'users_idx', + 'columns' => ['username', 'name'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] + ], + $tableMetadata->getIndexes() + ); + } + + public function testAddUniqueConstraint() + { + self::assertIsFluent($this->builder->withUniqueConstraint('users_idx', ['username', 'name'])); + + $tableMetadata = $this->builder->build(); + + self::assertEquals( + [ + 'users_idx' => [ + 'name' => 'users_idx', + 'columns' => ['username', 'name'], + 'options' => [], + 'flags' => [], + ] + ], + $tableMetadata->getUniqueConstraints() + ); + } + + public function testSetPrimaryTableRelated() + { + $this->builder->withUniqueConstraint('users_idx', ['username', 'name']); + $this->builder->withIndex('users_idx', ['username', 'name']); + $this->builder->withSchema('public'); + $this->builder->withName('users'); + + $tableMetadata = $this->builder->build(); + + self::assertEquals('public', $tableMetadata->getSchema()); + self::assertEquals('users', $tableMetadata->getName()); + self::assertEquals( + [ + 'users_idx' => [ + 'name' => 'users_idx', + 'columns' => ['username', 'name'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] + ], + $tableMetadata->getIndexes() + ); + self::assertEquals( + [ + 'users_idx' => [ + 'name' => 'users_idx', + 'columns' => ['username', 'name'], + 'options' => [], + 'flags' => [], + ] + ], + $tableMetadata->getUniqueConstraints() + ); + } + + protected function assertIsFluent($ret) + { + self::assertSame($this->builder, $ret, "Return Value has to be same instance as used builder"); + } +} diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php index 361f19103bd..99f88f5cdd8 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php @@ -57,13 +57,13 @@ public function testGetMetadataForSingleClass() self::assertTrue($cm1->hasField('name')); self::assertEquals(2, count($cm1->associationMappings)); self::assertEquals(ClassMetadata::GENERATOR_TYPE_AUTO, $cm1->generatorType); - self::assertEquals('group', $cm1->table['name']); + self::assertEquals('group', $cm1->table->getName()); // Go $cmMap1 = $cmf->getMetadataFor($cm1->name); self::assertSame($cm1, $cmMap1); - self::assertEquals('group', $cmMap1->table['name']); + self::assertEquals('group', $cmMap1->table->getName()); self::assertEquals([], $cmMap1->parentClasses); self::assertTrue($cmMap1->hasField('name')); } @@ -279,7 +279,11 @@ protected function _createValidClassMetadata() // Self-made metadata $cm1 = new ClassMetadata(TestEntity1::class); $cm1->initializeReflection(new RuntimeReflectionService()); - $cm1->setPrimaryTable(['name' => 'group']); + + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('group'); + + $cm1->setPrimaryTable($tableMetadata); // Add a mapped field $fieldMetadata = new Mapping\FieldMetadata('id'); diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 7cc887a730d..10cdb8cbf80 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -429,10 +429,12 @@ public function testGetTemporaryTableNameSchema() $cm = new ClassMetadata(CMS\CmsUser::class); $cm->initializeReflection(new RuntimeReflectionService()); - $cm->setPrimaryTable([ - 'schema' => 'foo', - 'name' => 'bar', - ]); + $tableMetadata = new Mapping\TableMetadata(); + + $tableMetadata->setSchema('foo'); + $tableMetadata->setName('bar'); + + $cm->setPrimaryTable($tableMetadata); self::assertEquals('foo_bar_id_tmp', $cm->getTemporaryIdTableName()); } @@ -443,11 +445,10 @@ public function testDefaultTableName() $cm->initializeReflection(new RuntimeReflectionService()); // When table's name is not given - $primaryTable = []; - $cm->setPrimaryTable($primaryTable); + $cm->setPrimaryTable(new Mapping\TableMetadata()); self::assertEquals('CmsUser', $cm->getTableName()); - self::assertEquals('CmsUser', $cm->table['name']); + self::assertEquals('CmsUser', $cm->table->getName()); $cm = new ClassMetadata(CMS\CmsAddress::class); $cm->initializeReflection(new RuntimeReflectionService()); @@ -1233,7 +1234,7 @@ public function testFullyQualifiedClassNameShouldBeGivenToNamingStrategy() ] ); - self::assertEquals('routing_routingleg', $routingMetadata->table['name']); + self::assertEquals('routing_routingleg', $routingMetadata->table->getName()); self::assertEquals('cms_cmsaddress_cms_cmsuser', $addressMetadata->associationMappings['user']['joinTable']['name']); self::assertEquals('doctrineglobal_article_cms_cmsuser', $articleMetadata->associationMappings['author']['joinTable']['name']); } diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsAddress.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsAddress.php index 9cac3a5466d..dd51bd33de2 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsAddress.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsAddress.php @@ -6,8 +6,11 @@ use Doctrine\ORM\Events; use Doctrine\Tests\Models\CMS\CmsAddress; +$tableMetadata = new Mapping\TableMetadata(); +$tableMetadata->setName('company_person'); + /* @var $metadata ClassMetadata */ -$metadata->setPrimaryTable(['name' => 'company_person']); +$metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('id'); $fieldMetadata->setType(Type::getType('integer')); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsUser.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsUser.php index 4b0075ecfe4..6d64e050d79 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsUser.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.CMS.CmsUser.php @@ -1,13 +1,13 @@ setPrimaryTable( - [ - 'name' => 'cms_users', - ] -); +$tableMetadata = new Mapping\TableMetadata(); +$tableMetadata->setName('cms_users'); + +/* @var $metadata ClassMetadata */ +$metadata->setPrimaryTable($tableMetadata); $metadata->addNamedNativeQuery( [ diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Cache.City.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Cache.City.php index 3f55b5c1006..ff1cdf98357 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Cache.City.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Cache.City.php @@ -8,8 +8,12 @@ use Doctrine\Tests\Models\Cache\Travel; /* @var $metadata ClassMetadata */ +$tableMetadata = new Mapping\TableMetadata(); + +$tableMetadata->setName('cache_city'); + +$metadata->setPrimaryTable($tableMetadata); $metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); -$metadata->setPrimaryTable(['name' => 'cache_city']); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_IDENTITY); $metadata->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_IMPLICIT); $metadata->enableCache(['usage' => ClassMetadata::CACHE_USAGE_READ_ONLY]); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyContract.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyContract.php index 3876640387a..7fcb2e50f11 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyContract.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyContract.php @@ -4,9 +4,12 @@ use Doctrine\ORM\Mapping; use Doctrine\ORM\Mapping\ClassMetadata; +$tableMetadata = new Mapping\TableMetadata(); +$tableMetadata->setName('company_contracts'); + /* @var $metadata ClassMetadata */ +$metadata->setPrimaryTable($tableMetadata); $metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_JOINED); -$metadata->setPrimaryTable(['name' => 'company_contracts']); $discrColumn = new Mapping\DiscriminatorColumnMetadata(); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyPerson.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyPerson.php index 95ab1c4e808..cdc897485a7 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyPerson.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.Company.CompanyPerson.php @@ -1,8 +1,14 @@ setName('company_person'); + +/* @var $metadata ClassMetadata */ +$metadata->setPrimaryTable($tableMetadata); + /** @var ClassMetadata $metadata */ $metadata->setPrimaryTable(['name' => 'company_person']); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php index 346a537e381..defc2208e2e 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php @@ -4,13 +4,13 @@ use Doctrine\ORM\Mapping; use Doctrine\ORM\Mapping\ClassMetadata; +$tableMetadata = new Mapping\TableMetadata(); +$tableMetadata->setSchema('explicit_schema'); +$tableMetadata->setName('explicit_table'); + /* @var $metadata ClassMetadata */ -$metadata->setPrimaryTable( - [ - 'name' => 'explicit_table', - 'schema' => 'explicit_schema', - ] -); +$metadata->setPrimaryTable($tableMetadata); +$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); $fieldMetadata = new Mapping\FieldMetadata('id'); @@ -18,5 +18,3 @@ $fieldMetadata->setPrimaryKey(true); $metadata->addProperty($fieldMetadata); - -$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.Comment.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.Comment.php index 92a56df983f..62fd65aa76d 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.Comment.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.Comment.php @@ -4,22 +4,22 @@ use Doctrine\ORM\Mapping; use Doctrine\ORM\Mapping\ClassMetadata; -/* @var $metadata ClassMetadata */ -$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); +$tableMetadata = new Mapping\TableMetadata(); -$metadata->setPrimaryTable( +$tableMetadata->addIndex( [ - 'indexes' => [ - [ - 'unique' => false, - 'columns' => ['content'], - 'flags' => ['fulltext'], - 'options' => ['where' => 'content IS NOT NULL'], - ], - ] + 'name' => null, + 'columns' => ['content'], + 'unique' => false, + 'flags' => ['fulltext'], + 'options' => ['where' => 'content IS NOT NULL'], ] ); +/* @var $metadata ClassMetadata */ +$metadata->setPrimaryTable($tableMetadata); +$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); + $fieldMetadata = new Mapping\FieldMetadata('content'); $fieldMetadata->setType(Type::getType('text')); diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php index f3f4282f1f9..3bd630677d8 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.ORM.Mapping.User.php @@ -7,8 +7,41 @@ use Doctrine\Tests\ORM\Mapping\Group; use Doctrine\Tests\ORM\Mapping\Phonenumber; +/* @var $metadata ClassMetadata */ +$tableMetadata = new Mapping\TableMetadata(); + +$tableMetadata->setName('cms_users'); +$tableMetadata->addIndex( + [ + 'name' => 'name_idx', + 'columns' => ['name'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] +); +$tableMetadata->addIndex( + [ + 'name' => null, + 'columns' => ['user_email'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] +); +$tableMetadata->addUniqueConstraint( + [ + 'name' => 'search_idx', + 'columns' => ['name', 'user_email'], + 'options' => [], + 'flags' => [], + ] +); +$tableMetadata->addOption('foo', 'bar'); +$tableMetadata->addOption('baz', ['key' => 'val']); + +$metadata->setPrimaryTable($tableMetadata); $metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); -$metadata->setPrimaryTable(['name' => 'cms_users']); $metadata->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_IMPLICIT); $metadata->addLifecycleCallback('doStuffOnPrePersist', 'prePersist'); @@ -22,6 +55,13 @@ ] ); +$metadata->setGeneratorDefinition( + [ + 'sequenceName' => 'tablename_seq', + 'allocationSize' => 100, + ] +); + $fieldMetadata = new Mapping\FieldMetadata('id'); $fieldMetadata->setType(Type::getType('integer')); @@ -132,33 +172,3 @@ 'orderBy' => null, ] ); - -$metadata->table['options'] = [ - 'foo' => 'bar', - 'baz' => ['key' => 'val'] -]; - -$metadata->table['uniqueConstraints'] = [ - 'search_idx' => [ - 'columns' => ['name', 'user_email'], - 'options' => ['where' => 'name IS NOT NULL'], - ], -]; - -$metadata->table['indexes'] = [ - 'name_idx' => [ - 'unique' => false, - 'columns' => ['name'], - ], - 0 => [ - 'unique' => false, - 'columns' => ['user_email'], - ] -]; - -$metadata->setGeneratorDefinition( - [ - 'sequenceName' => 'tablename_seq', - 'allocationSize' => 100, - ] -); diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml index 3a89dd97369..3b378f5206e 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd" > - + diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml index 49686f48ea9..e39093c5203 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.User.dcm.xml @@ -19,11 +19,7 @@ - - - - - + diff --git a/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php b/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php index 31a2163c88b..2363749f64a 100644 --- a/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/EntityGeneratorTest.php @@ -65,9 +65,29 @@ public function generateBookEntityFixture(array $embeddedClasses = []) $metadata = new ClassMetadata($this->_namespace . '\EntityGeneratorBook'); $metadata->customRepositoryClassName = $this->_namespace . '\EntityGeneratorBookRepository'; - $metadata->table['name'] = 'book'; - $metadata->table['uniqueConstraints']['name_uniq'] = ['columns' => ['name']]; - $metadata->table['indexes']['status_idx'] = ['columns' => ['status']]; + $tableMetadata = new Mapping\TableMetadata(); + + $tableMetadata->setName('book'); + $tableMetadata->addUniqueConstraint( + [ + 'name' => 'name_uniq', + 'columns' => ['name'], + 'options' => [], + 'flags' => [], + ] + ); + + $tableMetadata->addIndex( + [ + 'name' => 'status_idx', + 'columns' => ['status'], + 'unique' => false, + 'options' => [], + 'flags' => [], + ] + ); + + $metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('name'); @@ -167,7 +187,11 @@ public function generateBookEntityFixture(array $embeddedClasses = []) private function generateEntityTypeFixture(array $field) { $metadata = new ClassMetadata($this->_namespace . '\EntityType'); - $metadata->table['name'] = 'entity_type'; + + $tableMetadata = new Mapping\TableMetadata(); + $tableMetadata->setName('entity_type'); + + $metadata->setPrimaryTable($tableMetadata); $fieldMetadata = new Mapping\FieldMetadata('id'); $fieldMetadata->setType(Type::getType('integer')); diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php index 74782380a02..8a53dfeb660 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/AbstractClassMetadataExporterTest.php @@ -145,10 +145,10 @@ public function testExportedMetadataCanBeReadBackIn() */ public function testTableIsExported($class) { - self::assertEquals('cms_users', $class->table['name']); + self::assertEquals('cms_users', $class->table->getName()); self::assertEquals( ['engine' => 'MyISAM', 'foo' => ['bar' => 'baz']], - $class->table['options'] + $class->table->getOptions() ); return $class; diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php index 020a29f9629..deef7590524 100644 --- a/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php +++ b/tests/Doctrine/Tests/ORM/Tools/Export/php/Doctrine.Tests.ORM.Tools.Export.User.php @@ -9,17 +9,13 @@ use Doctrine\Tests\ORM\Tools\Export\GroupListener; use Doctrine\Tests\ORM\Tools\Export\UserListener; -$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); +$tableMetadata = new Mapping\TableMetadata(); +$tableMetadata->setName('cms_users'); +$tableMetadata->addOption('engine', 'MyISAM'); +$tableMetadata->addOption('foo', ['bar' => 'baz']); -$metadata->setPrimaryTable( - [ - 'name' => 'cms_users', - 'options' => [ - 'engine' => 'MyISAM', - 'foo' => ['bar' => 'baz'] - ], - ] -); +$metadata->setPrimaryTable($tableMetadata); +$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_NONE); $metadata->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_IMPLICIT); $metadata->addLifecycleCallback('doStuffOnPrePersist', Events::prePersist);