diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index faf23727541..da9b361d329 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -548,13 +548,7 @@ private function completeIdGeneratorMapping(ClassMetadataInfo $class): void { $idGenType = $class->generatorType; if ($idGenType === ClassMetadata::GENERATOR_TYPE_AUTO) { - if ($this->getTargetPlatform()->prefersSequences()) { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_SEQUENCE); - } elseif ($this->getTargetPlatform()->prefersIdentityColumns()) { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_IDENTITY); - } else { - $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_TABLE); - } + $class->setIdGeneratorType($this->determineIdGeneratorStrategy($this->getTargetPlatform())); } // Create & assign an appropriate ID generator instance @@ -658,6 +652,23 @@ private function completeIdGeneratorMapping(ClassMetadataInfo $class): void } } + private function determineIdGeneratorStrategy(AbstractPlatform $platform): int + { + if ($platform->getName() === 'oracle' || $platform->getName() === 'postgresql') { + return ClassMetadata::GENERATOR_TYPE_SEQUENCE; + } + + if ($platform->supportsIdentityColumns()) { + return ClassMetadata::GENERATOR_TYPE_IDENTITY; + } + + if ($platform->supportsSequences()) { + return ClassMetadata::GENERATOR_TYPE_SEQUENCE; + } + + return ClassMetadata::GENERATOR_TYPE_TABLE; + } + /** * Inherits the ID generator mapping from a parent class. */ diff --git a/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php b/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php index f230ffa2b9e..fadadbf93ee 100644 --- a/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php +++ b/tests/Doctrine/Tests/Mocks/DatabasePlatformMock.php @@ -4,6 +4,8 @@ namespace Doctrine\Tests\Mocks; +use BadMethodCallException; +use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Platforms\AbstractPlatform; /** @@ -11,29 +13,30 @@ */ class DatabasePlatformMock extends AbstractPlatform { - /** @var string */ - private $_sequenceNextValSql = ''; - /** @var bool */ - private $_prefersIdentityColumns = true; + private $supportsIdentityColumns = true; /** @var bool */ - private $_prefersSequences = false; + private $supportsSequences = false; - /** - * {@inheritdoc} - */ - public function prefersIdentityColumns() + public function prefersIdentityColumns(): bool { - return $this->_prefersIdentityColumns; + throw new BadMethodCallException('Call to deprecated method.'); } - /** - * {@inheritdoc} - */ - public function prefersSequences() + public function supportsIdentityColumns(): bool + { + return $this->supportsIdentityColumns; + } + + public function prefersSequences(): bool + { + throw new BadMethodCallException('Call to deprecated method.'); + } + + public function supportsSequences(): bool { - return $this->_prefersSequences; + return $this->supportsSequences; } /** @@ -41,7 +44,7 @@ public function prefersSequences() */ public function getSequenceNextValSQL($sequenceName) { - return $this->_sequenceNextValSql; + return ''; } /** @@ -95,19 +98,14 @@ public function getClobTypeDeclarationSQL(array $field) /* MOCK API */ - public function setPrefersIdentityColumns(bool $bool): void - { - $this->_prefersIdentityColumns = $bool; - } - - public function setPrefersSequences(bool $bool): void + public function setSupportsIdentityColumns(bool $bool): void { - $this->_prefersSequences = $bool; + $this->supportsIdentityColumns = $bool; } - public function setSequenceNextValSql(string $sql): void + public function setSupportsSequences(bool $bool): void { - $this->_sequenceNextValSql = $sql; + $this->supportsSequences = $bool; } /** diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php index a1b6e756d63..86ad9ed72c6 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataFactoryTest.php @@ -59,8 +59,8 @@ public function testGetMetadataForSingleClass(): void $conn = $entityManager->getConnection(); $mockPlatform = $conn->getDatabasePlatform(); - $mockPlatform->setPrefersSequences(true); - $mockPlatform->setPrefersIdentityColumns(false); + $mockPlatform->setSupportsSequences(true); + $mockPlatform->setSupportsIdentityColumns(false); $cm1 = $this->createValidClassMetadata();