Skip to content

Commit 00b621a

Browse files
authored
Merge pull request #6964 from morozov/foreign-key-constraint-default-options
Populate foreign key constraint options only with non-default values
2 parents 9cd1b2b + 95039c4 commit 00b621a

File tree

8 files changed

+113
-76
lines changed

8 files changed

+113
-76
lines changed

src/Schema/ForeignKeyConstraintEditor.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,20 @@ public function create(): ForeignKeyConstraint
226226
throw InvalidForeignKeyConstraintDefinition::referencedColumnNamesNotSet($this->name);
227227
}
228228

229+
$options = [];
230+
231+
if ($this->matchType !== MatchType::SIMPLE) {
232+
$options['match'] = $this->matchType->value;
233+
}
234+
235+
if ($this->onUpdateAction !== ReferentialAction::NO_ACTION) {
236+
$options['onUpdate'] = $this->onUpdateAction->value;
237+
}
238+
239+
if ($this->onDeleteAction !== ReferentialAction::NO_ACTION) {
240+
$options['onDelete'] = $this->onDeleteAction->value;
241+
}
242+
229243
return new ForeignKeyConstraint(
230244
array_map(
231245
static fn (UnqualifiedName $columnName) => $columnName->toString(),
@@ -237,11 +251,7 @@ public function create(): ForeignKeyConstraint
237251
$this->referencedColumnNames,
238252
),
239253
$this->name?->toString() ?? '',
240-
array_merge([
241-
'match' => $this->matchType->value,
242-
'onUpdate' => $this->onUpdateAction->value,
243-
'onDelete' => $this->onDeleteAction->value,
244-
], match ($this->deferrability) {
254+
array_merge($options, match ($this->deferrability) {
245255
Deferrability::NOT_DEFERRABLE => [],
246256
Deferrability::DEFERRABLE => ['deferrable' => true],
247257
Deferrability::DEFERRED => ['deferrable' => true, 'deferred' => true],

tests/Platforms/AbstractMySQLPlatformTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
220220
{
221221
return [
222222
'CREATE TABLE `quoted` (`create` VARCHAR(255) NOT NULL, foo VARCHAR(255) NOT NULL, '
223-
. '`bar` VARCHAR(255) NOT NULL, INDEX IDX_22660D028FD6E0FB8C736521D79164E3 (`create`, foo, `bar`))',
223+
. '`bar` VARCHAR(255) NOT NULL, INDEX IDX_22660D028FD6E0FB8C7365216D704F76 (`create`, foo, `bar`))',
224224
'ALTER TABLE `quoted` ADD CONSTRAINT FK_WITH_RESERVED_KEYWORD FOREIGN KEY (`create`, foo, `bar`)'
225225
. ' REFERENCES `foreign` (`create`, bar, `foo-bar`)',
226226
'ALTER TABLE `quoted` ADD CONSTRAINT FK_WITH_NON_RESERVED_KEYWORD FOREIGN KEY (`create`, foo, `bar`)'

tests/Platforms/AbstractPlatformTestCase.php

Lines changed: 92 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Doctrine\DBAL\Schema\ComparatorConfig;
1515
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
1616
use Doctrine\DBAL\Schema\Index;
17+
use Doctrine\DBAL\Schema\Name\UnqualifiedName;
1718
use Doctrine\DBAL\Schema\Table;
1819
use Doctrine\DBAL\Schema\TableDiff;
1920
use Doctrine\DBAL\Schema\UniqueConstraint;
@@ -422,47 +423,58 @@ public function testQuotedNameInIndexSQL(): void
422423

423424
public function testQuotedColumnInForeignKeyPropagation(): void
424425
{
425-
$table = new Table('`quoted`', [
426-
Column::editor()
427-
->setUnquotedName('create')
428-
->setTypeName(Types::STRING)
429-
->setLength(255)
430-
->create(),
431-
Column::editor()
432-
->setUnquotedName('foo')
433-
->setTypeName(Types::STRING)
434-
->setLength(255)
435-
->create(),
436-
Column::editor()
437-
->setQuotedName('bar')
438-
->setTypeName(Types::STRING)
439-
->setLength(255)
440-
->create(),
441-
]);
442-
443-
$table->addForeignKeyConstraint(
444-
'foreign',
445-
['create', 'foo', '`bar`'],
446-
['create', 'bar', '`foo-bar`'],
447-
[],
448-
'FK_WITH_RESERVED_KEYWORD',
449-
);
426+
$referencingColumnNames = [
427+
UnqualifiedName::unquoted('create'),
428+
UnqualifiedName::unquoted('foo'),
429+
UnqualifiedName::quoted('bar'),
430+
];
450431

451-
$table->addForeignKeyConstraint(
452-
'foo',
453-
['create', 'foo', '`bar`'],
454-
['create', 'bar', '`foo-bar`'],
455-
[],
456-
'FK_WITH_NON_RESERVED_KEYWORD',
457-
);
432+
$referencedColumnNames = [
433+
UnqualifiedName::unquoted('create'),
434+
UnqualifiedName::unquoted('bar'),
435+
UnqualifiedName::quoted('foo-bar'),
436+
];
458437

459-
$table->addForeignKeyConstraint(
460-
'`foo-bar`',
461-
['create', 'foo', '`bar`'],
462-
['create', 'bar', '`foo-bar`'],
463-
[],
464-
'FK_WITH_INTENDED_QUOTATION',
465-
);
438+
$table = Table::editor()
439+
->setQuotedName('quoted')
440+
->setColumns(
441+
Column::editor()
442+
->setUnquotedName('create')
443+
->setTypeName(Types::STRING)
444+
->setLength(255)
445+
->create(),
446+
Column::editor()
447+
->setUnquotedName('foo')
448+
->setTypeName(Types::STRING)
449+
->setLength(255)
450+
->create(),
451+
Column::editor()
452+
->setQuotedName('bar')
453+
->setTypeName(Types::STRING)
454+
->setLength(255)
455+
->create(),
456+
)
457+
->setForeignKeyConstraints(
458+
ForeignKeyConstraint::editor()
459+
->setUnquotedName('FK_WITH_RESERVED_KEYWORD')
460+
->setReferencingColumnNames(...$referencingColumnNames)
461+
->setUnquotedReferencedTableName('foreign')
462+
->setReferencedColumnNames(...$referencedColumnNames)
463+
->create(),
464+
ForeignKeyConstraint::editor()
465+
->setUnquotedName('FK_WITH_NON_RESERVED_KEYWORD')
466+
->setReferencingColumnNames(...$referencingColumnNames)
467+
->setUnquotedReferencedTableName('foo')
468+
->setReferencedColumnNames(...$referencedColumnNames)
469+
->create(),
470+
ForeignKeyConstraint::editor()
471+
->setUnquotedName('FK_WITH_INTENDED_QUOTATION')
472+
->setReferencingColumnNames(...$referencingColumnNames)
473+
->setQuotedReferencedTableName('foo-bar')
474+
->setReferencedColumnNames(...$referencedColumnNames)
475+
->create(),
476+
)
477+
->create();
466478

467479
$sql = $this->platform->getCreateTableSQL($table);
468480
self::assertEquals($this->getQuotedColumnInForeignKeySQL(), $sql);
@@ -974,32 +986,47 @@ abstract protected function getAlterStringToFixedStringSQL(): array;
974986

975987
public function testGeneratesAlterTableRenameIndexUsedByForeignKeySQL(): void
976988
{
977-
$foreignTable = new Table('foreign_table', [
978-
Column::editor()
979-
->setUnquotedName('id')
980-
->setTypeName(Types::INTEGER)
981-
->create(),
982-
]);
983-
$foreignTable->setPrimaryKey(['id']);
984-
985-
$primaryTable = new Table('mytable', [
986-
Column::editor()
987-
->setUnquotedName('foo')
988-
->setTypeName(Types::INTEGER)
989-
->create(),
990-
Column::editor()
991-
->setUnquotedName('bar')
992-
->setTypeName(Types::INTEGER)
993-
->create(),
994-
Column::editor()
995-
->setUnquotedName('baz')
996-
->setTypeName(Types::INTEGER)
997-
->create(),
998-
]);
999-
$primaryTable->addIndex(['foo'], 'idx_foo');
1000-
$primaryTable->addIndex(['bar'], 'idx_bar');
1001-
$primaryTable->addForeignKeyConstraint($foreignTable->getName(), ['foo'], ['id'], [], 'fk_foo');
1002-
$primaryTable->addForeignKeyConstraint($foreignTable->getName(), ['bar'], ['id'], [], 'fk_bar');
989+
$primaryTable = Table::editor()
990+
->setUnquotedName('mytable')
991+
->setColumns(
992+
Column::editor()
993+
->setUnquotedName('foo')
994+
->setTypeName(Types::INTEGER)
995+
->create(),
996+
Column::editor()
997+
->setUnquotedName('bar')
998+
->setTypeName(Types::INTEGER)
999+
->create(),
1000+
Column::editor()
1001+
->setUnquotedName('baz')
1002+
->setTypeName(Types::INTEGER)
1003+
->create(),
1004+
)
1005+
->setIndexes(
1006+
Index::editor()
1007+
->setUnquotedName('idx_foo')
1008+
->setUnquotedColumnNames('foo')
1009+
->create(),
1010+
Index::editor()
1011+
->setUnquotedName('idx_bar')
1012+
->setUnquotedColumnNames('bar')
1013+
->create(),
1014+
)
1015+
->setForeignKeyConstraints(
1016+
ForeignKeyConstraint::editor()
1017+
->setUnquotedName('fk_foo')
1018+
->setUnquotedReferencingColumnNames('foo')
1019+
->setUnquotedReferencedTableName('foreign_table')
1020+
->setUnquotedReferencedColumnNames('id')
1021+
->create(),
1022+
ForeignKeyConstraint::editor()
1023+
->setUnquotedName('fk_bar')
1024+
->setUnquotedReferencingColumnNames('bar')
1025+
->setUnquotedReferencedTableName('foreign_table')
1026+
->setUnquotedReferencedColumnNames('id')
1027+
->create(),
1028+
)
1029+
->create();
10031030

10041031
$tableDiff = new TableDiff($primaryTable, renamedIndexes: [
10051032
'idx_foo' => new Index('idx_foo_renamed', ['foo']),

tests/Platforms/DB2PlatformTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
6969
. ' REFERENCES foo ("create", bar, "foo-bar")',
7070
'ALTER TABLE "quoted" ADD CONSTRAINT FK_WITH_INTENDED_QUOTATION FOREIGN KEY ("create", foo, "bar")'
7171
. ' REFERENCES "foo-bar" ("create", bar, "foo-bar")',
72-
'CREATE INDEX IDX_22660D028FD6E0FB8C736521D79164E3 ON "quoted" ("create", foo, "bar")',
72+
'CREATE INDEX IDX_22660D028FD6E0FB8C7365216D704F76 ON "quoted" ("create", foo, "bar")',
7373
];
7474
}
7575

tests/Platforms/OraclePlatformTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
306306
. ' REFERENCES foo ("create", bar, "foo-bar")',
307307
'ALTER TABLE "quoted" ADD CONSTRAINT FK_WITH_INTENDED_QUOTATION FOREIGN KEY ("create", foo, "bar")'
308308
. ' REFERENCES "foo-bar" ("create", bar, "foo-bar")',
309-
'CREATE INDEX IDX_22660D028FD6E0FB8C736521D79164E3 ON "quoted" ("create", foo, "bar")',
309+
'CREATE INDEX IDX_22660D028FD6E0FB8C7365216D704F76 ON "quoted" ("create", foo, "bar")',
310310
];
311311
}
312312

tests/Platforms/PostgreSQLPlatformTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
379379
return [
380380
'CREATE TABLE "quoted" ("create" VARCHAR(255) NOT NULL, '
381381
. 'foo VARCHAR(255) NOT NULL, "bar" VARCHAR(255) NOT NULL)',
382-
'CREATE INDEX IDX_22660D028FD6E0FB8C736521D79164E3 ON "quoted" ("create", foo, "bar")',
382+
'CREATE INDEX IDX_22660D028FD6E0FB8C7365216D704F76 ON "quoted" ("create", foo, "bar")',
383383
'ALTER TABLE "quoted" ADD CONSTRAINT FK_WITH_RESERVED_KEYWORD FOREIGN KEY ("create", foo, "bar")'
384384
. ' REFERENCES "foreign" ("create", bar, "foo-bar")',
385385
'ALTER TABLE "quoted" ADD CONSTRAINT FK_WITH_NON_RESERVED_KEYWORD FOREIGN KEY ("create", foo, "bar")'

tests/Platforms/SQLServerPlatformTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
644644
return [
645645
'CREATE TABLE [quoted] ([create] NVARCHAR(255) NOT NULL, '
646646
. 'foo NVARCHAR(255) NOT NULL, [bar] NVARCHAR(255) NOT NULL)',
647-
'CREATE INDEX IDX_22660D028FD6E0FB8C736521D79164E3 ON [quoted] ([create], foo, [bar])',
647+
'CREATE INDEX IDX_22660D028FD6E0FB8C7365216D704F76 ON [quoted] ([create], foo, [bar])',
648648
'ALTER TABLE [quoted] ADD CONSTRAINT FK_WITH_RESERVED_KEYWORD'
649649
. ' FOREIGN KEY ([create], foo, [bar]) REFERENCES [foreign] ([create], bar, [foo-bar])',
650650
'ALTER TABLE [quoted] ADD CONSTRAINT FK_WITH_NON_RESERVED_KEYWORD'

tests/Platforms/SQLitePlatformTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ protected function getQuotedColumnInForeignKeySQL(): array
471471
'REFERENCES foo ("create", bar, "foo-bar") NOT DEFERRABLE INITIALLY IMMEDIATE, ' .
472472
'CONSTRAINT FK_WITH_INTENDED_QUOTATION FOREIGN KEY ("create", foo, "bar") ' .
473473
'REFERENCES "foo-bar" ("create", bar, "foo-bar") NOT DEFERRABLE INITIALLY IMMEDIATE)',
474-
'CREATE INDEX IDX_22660D028FD6E0FB8C736521D79164E3 ON "quoted" ("create", foo, "bar")',
474+
'CREATE INDEX IDX_22660D028FD6E0FB8C7365216D704F76 ON "quoted" ("create", foo, "bar")',
475475
];
476476
}
477477

0 commit comments

Comments
 (0)