diff --git a/docs/en/reference/schema-manager.rst b/docs/en/reference/schema-manager.rst index cb462ca0540..1eda305ac74 100644 --- a/docs/en/reference/schema-manager.rst +++ b/docs/en/reference/schema-manager.rst @@ -217,7 +217,7 @@ the changes on the database: .. code-block:: php getMigrateToSql($toSchema, $conn->getDatabasePlatform()); + $sql = $sm->createComparator()->compareSchemas($fromSchema, $toSchema)->toSql($conn->getDatabasePlatform()); The ``$sql`` array should give you a SQL query to drop the user table: @@ -233,6 +233,29 @@ table: ) */ +createComparator() +------------------ + +To create a comparator that can be used to compare two schemas use the +``createComparator()`` method which returns an instance of +``Doctrine\DBAL\Schema\Comparator``. + +.. code-block:: php + + createComparator(); + $schemaDiff = $comparator->compareSchemas($fromSchema, $toSchema); + +To change the configuration of the comparator, you can pass a +``Doctrine\DBAL\Schema\ComparatorConfig`` object to the method: + +.. code-block:: php + + withDetectRenamedColumns(false); + $comparator = $sm->createComparator($config); + $schemaDiff = $comparator->compareSchemas($fromSchema, $toSchema); + Overriding the schema manager ----------------------------- diff --git a/src/Connection.php b/src/Connection.php index c936b4a302a..5a66e1ad21c 100644 --- a/src/Connection.php +++ b/src/Connection.php @@ -926,15 +926,20 @@ public function lastInsertId(): int|string public function transactional(Closure $func): mixed { $this->beginTransaction(); + + $successful = false; + try { $res = $func($this); $this->commit(); - return $res; - } catch (Throwable $e) { - $this->rollBack(); + $successful = true; - throw $e; + return $res; + } finally { + if (! $successful) { + $this->rollBack(); + } } } diff --git a/src/Platforms/MySQL/Comparator.php b/src/Platforms/MySQL/Comparator.php index ebe025dc2a9..af2dbe88215 100644 --- a/src/Platforms/MySQL/Comparator.php +++ b/src/Platforms/MySQL/Comparator.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Platforms\AbstractMySQLPlatform; use Doctrine\DBAL\Schema\Comparator as BaseComparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; @@ -26,8 +27,9 @@ public function __construct( private readonly CharsetMetadataProvider $charsetMetadataProvider, private readonly CollationMetadataProvider $collationMetadataProvider, private readonly DefaultTableOptions $defaultTableOptions, + ComparatorConfig $config = new ComparatorConfig(), ) { - parent::__construct($platform); + parent::__construct($platform, $config); } public function compareTables(Table $oldTable, Table $newTable): TableDiff diff --git a/src/Platforms/SQLServer/Comparator.php b/src/Platforms/SQLServer/Comparator.php index aa8d9fb5b62..079e70eafaf 100644 --- a/src/Platforms/SQLServer/Comparator.php +++ b/src/Platforms/SQLServer/Comparator.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Platforms\SQLServerPlatform; use Doctrine\DBAL\Schema\Comparator as BaseComparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; @@ -17,9 +18,12 @@ class Comparator extends BaseComparator { /** @internal The comparator can be only instantiated by a schema manager. */ - public function __construct(SQLServerPlatform $platform, private readonly string $databaseCollation) - { - parent::__construct($platform); + public function __construct( + SQLServerPlatform $platform, + private readonly string $databaseCollation, + ComparatorConfig $config = new ComparatorConfig(), + ) { + parent::__construct($platform, $config); } public function compareTables(Table $oldTable, Table $newTable): TableDiff diff --git a/src/Platforms/SQLite/Comparator.php b/src/Platforms/SQLite/Comparator.php index f27e1b4571c..d14aefb29b5 100644 --- a/src/Platforms/SQLite/Comparator.php +++ b/src/Platforms/SQLite/Comparator.php @@ -6,6 +6,7 @@ use Doctrine\DBAL\Platforms\SQLitePlatform; use Doctrine\DBAL\Schema\Comparator as BaseComparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; @@ -19,9 +20,9 @@ class Comparator extends BaseComparator { /** @internal The comparator can be only instantiated by a schema manager. */ - public function __construct(SQLitePlatform $platform) + public function __construct(SQLitePlatform $platform, ComparatorConfig $config = new ComparatorConfig()) { - parent::__construct($platform); + parent::__construct($platform, $config); } public function compareTables(Table $oldTable, Table $newTable): TableDiff diff --git a/src/Schema/AbstractSchemaManager.php b/src/Schema/AbstractSchemaManager.php index 97307979a96..9b192ddd674 100644 --- a/src/Schema/AbstractSchemaManager.php +++ b/src/Schema/AbstractSchemaManager.php @@ -17,6 +17,8 @@ use function array_map; use function array_values; use function count; +use function func_get_arg; +use function func_num_args; use function strtolower; /** @@ -840,9 +842,9 @@ private function getDatabase(string $methodName): string return $database; } - public function createComparator(): Comparator + public function createComparator(/* ComparatorConfig $config = new ComparatorConfig() */): Comparator { - return new Comparator($this->platform); + return new Comparator($this->platform, func_num_args() > 0 ? func_get_arg(0) : new ComparatorConfig()); } /** diff --git a/src/Schema/Comparator.php b/src/Schema/Comparator.php index 240df8965dd..a2b18b802c3 100644 --- a/src/Schema/Comparator.php +++ b/src/Schema/Comparator.php @@ -17,8 +17,10 @@ class Comparator { /** @internal The comparator can be only instantiated by a schema manager. */ - public function __construct(private readonly AbstractPlatform $platform) - { + public function __construct( + private readonly AbstractPlatform $platform, + private readonly ComparatorConfig $config = new ComparatorConfig(), + ) { } /** @@ -149,6 +151,7 @@ public function compareTables(Table $oldTable, Table $newTable): TableDiff $addedIndexes = []; $modifiedIndexes = []; $droppedIndexes = []; + $renamedIndexes = []; $addedForeignKeys = []; $modifiedForeignKeys = []; $droppedForeignKeys = []; @@ -207,7 +210,9 @@ public function compareTables(Table $oldTable, Table $newTable): TableDiff ); } - $this->detectRenamedColumns($modifiedColumns, $addedColumns, $droppedColumns); + if ($this->config->getDetectRenamedColumns()) { + $this->detectRenamedColumns($modifiedColumns, $addedColumns, $droppedColumns); + } $oldIndexes = $oldTable->getIndexes(); $newIndexes = $newTable->getIndexes(); @@ -244,7 +249,9 @@ public function compareTables(Table $oldTable, Table $newTable): TableDiff $modifiedIndexes[] = $newIndex; } - $renamedIndexes = $this->detectRenamedIndexes($addedIndexes, $droppedIndexes); + if ($this->config->getDetectRenamedIndexes()) { + $renamedIndexes = $this->detectRenamedIndexes($addedIndexes, $droppedIndexes); + } $oldForeignKeys = $oldTable->getForeignKeys(); $newForeignKeys = $newTable->getForeignKeys(); diff --git a/src/Schema/ComparatorConfig.php b/src/Schema/ComparatorConfig.php new file mode 100644 index 00000000000..4f5fa59cc4e --- /dev/null +++ b/src/Schema/ComparatorConfig.php @@ -0,0 +1,40 @@ +detectRenamedIndexes, + ); + } + + public function getDetectRenamedColumns(): bool + { + return $this->detectRenamedColumns; + } + + public function withDetectRenamedIndexes(bool $detectRenamedIndexes): self + { + return new self( + $this->detectRenamedColumns, + $detectRenamedIndexes, + ); + } + + public function getDetectRenamedIndexes(): bool + { + return $this->detectRenamedIndexes; + } +} diff --git a/src/Schema/MySQLSchemaManager.php b/src/Schema/MySQLSchemaManager.php index becb6819e8b..b2695826385 100644 --- a/src/Schema/MySQLSchemaManager.php +++ b/src/Schema/MySQLSchemaManager.php @@ -20,6 +20,8 @@ use function array_map; use function assert; use function explode; +use function func_get_arg; +use function func_num_args; use function implode; use function is_string; use function preg_match; @@ -335,7 +337,7 @@ protected function _getPortableTableForeignKeyDefinition(array $tableForeignKey) } /** @throws Exception */ - public function createComparator(): Comparator + public function createComparator(/* ComparatorConfig $config = new ComparatorConfig() */): Comparator { return new MySQL\Comparator( $this->platform, @@ -346,6 +348,7 @@ public function createComparator(): Comparator new ConnectionCollationMetadataProvider($this->connection), ), $this->getDefaultTableOptions(), + func_num_args() > 0 ? func_get_arg(0) : new ComparatorConfig(), ); } diff --git a/src/Schema/SQLServerSchemaManager.php b/src/Schema/SQLServerSchemaManager.php index e0a74ce2a81..f93d99bba6c 100644 --- a/src/Schema/SQLServerSchemaManager.php +++ b/src/Schema/SQLServerSchemaManager.php @@ -13,6 +13,8 @@ use function array_change_key_case; use function assert; use function explode; +use function func_get_arg; +use function func_num_args; use function implode; use function is_string; use function preg_match; @@ -262,9 +264,13 @@ protected function _getPortableViewDefinition(array $view): View } /** @throws Exception */ - public function createComparator(): Comparator + public function createComparator(/* ComparatorConfig $config = new ComparatorConfig() */): Comparator { - return new SQLServer\Comparator($this->platform, $this->getDatabaseCollation()); + return new SQLServer\Comparator( + $this->platform, + $this->getDatabaseCollation(), + func_num_args() > 0 ? func_get_arg(0) : new ComparatorConfig(), + ); } /** @throws Exception */ diff --git a/src/Schema/SQLiteSchemaManager.php b/src/Schema/SQLiteSchemaManager.php index 54da7c10065..819188a60c6 100644 --- a/src/Schema/SQLiteSchemaManager.php +++ b/src/Schema/SQLiteSchemaManager.php @@ -16,6 +16,8 @@ use function array_merge; use function assert; use function count; +use function func_get_arg; +use function func_num_args; use function implode; use function is_string; use function preg_match; @@ -494,9 +496,9 @@ private function getForeignKeyDetails(string $table): array return $details; } - public function createComparator(): Comparator + public function createComparator(/* ComparatorConfig $config = new ComparatorConfig() */): Comparator { - return new SQLite\Comparator($this->platform); + return new SQLite\Comparator($this->platform, func_num_args() > 0 ? func_get_arg(0) : new ComparatorConfig()); } protected function selectTableNames(string $databaseName): Result diff --git a/tests/ConnectionTest.php b/tests/ConnectionTest.php index 29922683d4e..cac8873a755 100644 --- a/tests/ConnectionTest.php +++ b/tests/ConnectionTest.php @@ -623,4 +623,25 @@ public function testDefaultSchemaManagerFactory(): void $connection = DriverManager::getConnection(['driver' => 'sqlite3', 'memory' => true]); self::assertInstanceOf(SQLiteSchemaManager::class, $connection->createSchemaManager()); } + + public function testItPreservesTheOriginalExceptionOnRollbackFailure(): void + { + $connection = new class (['memory' => true], new Driver\SQLite3\Driver()) extends Connection { + public function rollBack(): void + { + throw new ConnectionException('Rollback exception'); + } + }; + + try { + $connection->transactional(static function (): void { + throw new ConnectionException('Original exception'); + }); + self::fail('Exception expected'); // @phpstan-ignore deadCode.unreachable + } catch (ConnectionException $e) { + self::assertSame('Rollback exception', $e->getMessage()); + self::assertNotNull($e->getPrevious()); + self::assertSame('Original exception', $e->getPrevious()->getMessage()); + } + } } diff --git a/tests/Functional/Schema/ComparatorTest.php b/tests/Functional/Schema/ComparatorTest.php index da7244aad9c..17bd048e4ea 100644 --- a/tests/Functional/Schema/ComparatorTest.php +++ b/tests/Functional/Schema/ComparatorTest.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Schema\AbstractSchemaManager; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Tests\Functional\Platform\RenameColumnTest; use Doctrine\DBAL\Tests\FunctionalTestCase; @@ -53,7 +54,7 @@ public function testDefaultValueComparison(string $type, mixed $value): void public function testRenameColumnComparison(): void { $platform = $this->connection->getDatabasePlatform(); - $comparator = new Comparator($platform); + $comparator = new Comparator($platform, new ComparatorConfig()); $table = new Table('rename_table'); $table->addColumn('test', Types::STRING, ['default' => 'baz', 'length' => 20]); diff --git a/tests/Platforms/AbstractMySQLPlatformTestCase.php b/tests/Platforms/AbstractMySQLPlatformTestCase.php index 9c569cece8d..3db52b9bd86 100644 --- a/tests/Platforms/AbstractMySQLPlatformTestCase.php +++ b/tests/Platforms/AbstractMySQLPlatformTestCase.php @@ -11,6 +11,7 @@ use Doctrine\DBAL\Platforms\MySQL\CollationMetadataProvider; use Doctrine\DBAL\Platforms\MySQL\DefaultTableOptions; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\TransactionIsolationLevel; use Doctrine\DBAL\Types\Types; @@ -692,6 +693,7 @@ protected function createComparator(): Comparator self::createStub(CharsetMetadataProvider::class), self::createStub(CollationMetadataProvider::class), new DefaultTableOptions('utf8mb4', 'utf8mb4_general_ci'), + new ComparatorConfig(), ); } } diff --git a/tests/Platforms/AbstractPlatformTestCase.php b/tests/Platforms/AbstractPlatformTestCase.php index 67b9afdd9a8..c913cdc2c06 100644 --- a/tests/Platforms/AbstractPlatformTestCase.php +++ b/tests/Platforms/AbstractPlatformTestCase.php @@ -10,6 +10,7 @@ use Doctrine\DBAL\Schema\Column; use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\ForeignKeyConstraint; use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\Table; @@ -40,7 +41,7 @@ protected function setUp(): void protected function createComparator(): Comparator { - return new Comparator($this->platform); + return new Comparator($this->platform, new ComparatorConfig()); } public function testQuoteIdentifier(): void diff --git a/tests/Platforms/MySQL/ComparatorTest.php b/tests/Platforms/MySQL/ComparatorTest.php index d2d8a25ad21..da57a11bf10 100644 --- a/tests/Platforms/MySQL/ComparatorTest.php +++ b/tests/Platforms/MySQL/ComparatorTest.php @@ -9,17 +9,19 @@ use Doctrine\DBAL\Platforms\MySQL\Comparator; use Doctrine\DBAL\Platforms\MySQL\DefaultTableOptions; use Doctrine\DBAL\Platforms\MySQLPlatform; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Tests\Schema\AbstractComparatorTestCase; class ComparatorTest extends AbstractComparatorTestCase { - protected function setUp(): void + protected function createComparator(ComparatorConfig $config): Comparator { - $this->comparator = new Comparator( + return new Comparator( new MySQLPlatform(), self::createStub(CharsetMetadataProvider::class), self::createStub(CollationMetadataProvider::class), new DefaultTableOptions('utf8mb4', 'utf8mb4_general_ci'), + $config, ); } } diff --git a/tests/Platforms/MySQL/MariaDBJsonComparatorTest.php b/tests/Platforms/MySQL/MariaDBJsonComparatorTest.php index ef9c99d24a4..08ed0ce0768 100644 --- a/tests/Platforms/MySQL/MariaDBJsonComparatorTest.php +++ b/tests/Platforms/MySQL/MariaDBJsonComparatorTest.php @@ -9,6 +9,7 @@ use Doctrine\DBAL\Platforms\MySQL\CollationMetadataProvider; use Doctrine\DBAL\Platforms\MySQL\Comparator; use Doctrine\DBAL\Platforms\MySQL\DefaultTableOptions; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Types\Types; use PHPUnit\Framework\Attributes\DataProvider; @@ -40,6 +41,7 @@ public function getCollationCharset(string $collation): ?string } }, new DefaultTableOptions('utf8mb4', 'utf8mb4_general_ci'), + new ComparatorConfig(), ); // TableA has collation set at table level and various column collations diff --git a/tests/Platforms/SQLServer/ComparatorTest.php b/tests/Platforms/SQLServer/ComparatorTest.php index d93bfcf021a..682fc204454 100644 --- a/tests/Platforms/SQLServer/ComparatorTest.php +++ b/tests/Platforms/SQLServer/ComparatorTest.php @@ -6,12 +6,13 @@ use Doctrine\DBAL\Platforms\SQLServer\Comparator; use Doctrine\DBAL\Platforms\SQLServerPlatform; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Tests\Schema\AbstractComparatorTestCase; class ComparatorTest extends AbstractComparatorTestCase { - protected function setUp(): void + protected function createComparator(ComparatorConfig $config): Comparator { - $this->comparator = new Comparator(new SQLServerPlatform(), ''); + return new Comparator(new SQLServerPlatform(), '', $config); } } diff --git a/tests/Platforms/SQLServerPlatformTest.php b/tests/Platforms/SQLServerPlatformTest.php index ac8337344df..b28bf60d07f 100644 --- a/tests/Platforms/SQLServerPlatformTest.php +++ b/tests/Platforms/SQLServerPlatformTest.php @@ -13,6 +13,7 @@ use Doctrine\DBAL\Schema\Column; use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\Sequence; use Doctrine\DBAL\Schema\Table; @@ -32,7 +33,7 @@ public function createPlatform(): AbstractPlatform protected function createComparator(): Comparator { - return new SQLServer\Comparator($this->platform, ''); + return new SQLServer\Comparator($this->platform, '', new ComparatorConfig()); } public function getGenerateTableSql(): string diff --git a/tests/Platforms/SQLite/ComparatorTest.php b/tests/Platforms/SQLite/ComparatorTest.php index 4ed8911b91c..59275581dd5 100644 --- a/tests/Platforms/SQLite/ComparatorTest.php +++ b/tests/Platforms/SQLite/ComparatorTest.php @@ -6,13 +6,14 @@ use Doctrine\DBAL\Platforms\SQLite\Comparator; use Doctrine\DBAL\Platforms\SQLitePlatform; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Tests\Schema\AbstractComparatorTestCase; class ComparatorTest extends AbstractComparatorTestCase { - protected function setUp(): void + protected function createComparator(ComparatorConfig $config): Comparator { - $this->comparator = new Comparator(new SQLitePlatform()); + return new Comparator(new SQLitePlatform(), $config); } public function testCompareChangedBinaryColumn(): void diff --git a/tests/Platforms/SQLitePlatformTest.php b/tests/Platforms/SQLitePlatformTest.php index 5d400c37eae..2724026f92f 100644 --- a/tests/Platforms/SQLitePlatformTest.php +++ b/tests/Platforms/SQLitePlatformTest.php @@ -11,6 +11,7 @@ use Doctrine\DBAL\Schema\Column; use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; @@ -30,7 +31,7 @@ public function createPlatform(): AbstractPlatform protected function createComparator(): Comparator { - return new SQLite\Comparator($this->platform); + return new SQLite\Comparator($this->platform, new ComparatorConfig()); } public function getGenerateTableSql(): string diff --git a/tests/Schema/AbstractComparatorTestCase.php b/tests/Schema/AbstractComparatorTestCase.php index 759b6740f13..f698ea3f3e8 100644 --- a/tests/Schema/AbstractComparatorTestCase.php +++ b/tests/Schema/AbstractComparatorTestCase.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\Schema\Column; use Doctrine\DBAL\Schema\ColumnDiff; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\ForeignKeyConstraint; use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\Schema; @@ -27,7 +28,14 @@ abstract class AbstractComparatorTestCase extends TestCase { - protected Comparator $comparator; + private Comparator $comparator; + + abstract protected function createComparator(ComparatorConfig $config): Comparator; + + protected function setUp(): void + { + $this->comparator = $this->createComparator(new ComparatorConfig()); + } public function testCompareSame1(): void { @@ -399,6 +407,22 @@ public function testDetectRenameColumn(): void self::assertEquals('bar', $renamedColumns['foo']->getName()); } + public function testDetectRenameColumnDisabled(): void + { + $tableA = new Table('foo'); + $tableA->addColumn('foo', Types::INTEGER); + + $tableB = new Table('foo'); + $tableB->addColumn('bar', Types::INTEGER); + + $this->comparator = $this->createComparator((new ComparatorConfig())->withDetectRenamedColumns(false)); + $tableDiff = $this->comparator->compareTables($tableA, $tableB); + + self::assertCount(1, $tableDiff->getAddedColumns()); + self::assertCount(1, $tableDiff->getDroppedColumns()); + self::assertCount(0, $tableDiff->getRenamedColumns()); + } + /** * You can easily have ambiguities in the column renaming. If these * are detected no renaming should take place, instead adding and dropping @@ -441,6 +465,25 @@ public function testDetectRenameIndex(): void self::assertEquals('idx_bar', $renamedIndexes['idx_foo']->getName()); } + public function testDetectRenameIndexDisabled(): void + { + $table1 = new Table('foo'); + $table1->addColumn('foo', Types::INTEGER); + + $table2 = clone $table1; + + $table1->addIndex(['foo'], 'idx_foo'); + + $table2->addIndex(['foo'], 'idx_bar'); + + $this->comparator = $this->createComparator((new ComparatorConfig())->withDetectRenamedIndexes(false)); + $tableDiff = $this->comparator->compareTables($table1, $table2); + + self::assertCount(1, $tableDiff->getAddedIndexes()); + self::assertCount(1, $tableDiff->getDroppedIndexes()); + self::assertCount(0, $tableDiff->getRenamedIndexes()); + } + /** * You can easily have ambiguities in the index renaming. If these * are detected no renaming should take place, instead adding and dropping diff --git a/tests/Schema/Platforms/MySQLSchemaTest.php b/tests/Schema/Platforms/MySQLSchemaTest.php index fee785069e2..252808c2a00 100644 --- a/tests/Schema/Platforms/MySQLSchemaTest.php +++ b/tests/Schema/Platforms/MySQLSchemaTest.php @@ -11,6 +11,7 @@ use Doctrine\DBAL\Platforms\MySQL\DefaultTableOptions; use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Schema\Comparator; +use Doctrine\DBAL\Schema\ComparatorConfig; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Types\Types; use PHPUnit\Framework\TestCase; @@ -71,6 +72,7 @@ private function createComparator(): Comparator self::createStub(CharsetMetadataProvider::class), self::createStub(CollationMetadataProvider::class), new DefaultTableOptions('utf8mb4', 'utf8mb4_general_ci'), + new ComparatorConfig(), ); } }