Skip to content

Commit

Permalink
Move joinTableColumns down
Browse files Browse the repository at this point in the history
This field only makes sense for the owning side of many-to-many
mappings. Moving it down allows us to make it non-nullable.
  • Loading branch information
greg0ire committed Apr 17, 2023
1 parent ada109b commit 49cc83d
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 15 deletions.
4 changes: 0 additions & 4 deletions lib/Doctrine/ORM/Mapping/AssociationMapping.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,6 @@ abstract class AssociationMapping implements ArrayAccess
/** @var array<string, string>|null */
public array|null $joinColumnFieldNames = null;

/** @var list<mixed>|null */
public array|null $joinTableColumns = null;

/** @var class-string|null */
public string|null $originalClass = null;

Expand Down Expand Up @@ -336,7 +333,6 @@ public function __sleep(): array
'declared',
'cache',
'joinColumnFieldNames',
'joinTableColumns',
'originalClass',
'originalField',
] as $stringOrArrayProperty
Expand Down
1 change: 0 additions & 1 deletion lib/Doctrine/ORM/Mapping/ClassMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -1722,7 +1722,6 @@ public function setAssociationOverride(string $fieldName, array $overrideMapping
}

$mapping['joinColumnFieldNames'] = null;
$mapping['joinTableColumns'] = null;

switch ($mapping['type']) {
case self::ONE_TO_ONE:
Expand Down
4 changes: 4 additions & 0 deletions lib/Doctrine/ORM/Mapping/ManyToManyOwningSideMapping.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ final class ManyToManyOwningSideMapping extends ManyToManyAssociationMapping imp
*/
public JoinTableMapping $joinTable;

/** @var list<mixed> */
public array $joinTableColumns = [];

/** @return array<string, mixed> */
public function toArray(): array
{
Expand Down Expand Up @@ -130,6 +133,7 @@ public function __sleep(): array
{
$serialized = parent::__sleep();
$serialized[] = 'joinTable';
$serialized[] = 'joinTableColumns';

return $serialized;
}
Expand Down
16 changes: 10 additions & 6 deletions lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

use function array_fill;
use function array_pop;
use function assert;
use function count;
use function implode;
use function in_array;
Expand Down Expand Up @@ -501,9 +502,10 @@ private function collectJoinTableColumnParameters(
PersistentCollection $collection,
object $element,
): array {
$params = [];
$mapping = $collection->getMapping();
$isComposite = count($mapping['joinTableColumns']) > 2;
$params = [];
$mapping = $collection->getMapping();
assert($mapping->isManyToManyOwningSide());
$isComposite = count($mapping->joinTableColumns) > 2;

$identifier1 = $this->uow->getEntityIdentifier($collection->getOwner());
$identifier2 = $this->uow->getEntityIdentifier($element);
Expand All @@ -514,7 +516,7 @@ private function collectJoinTableColumnParameters(
$class2 = $collection->getTypeClass();
}

foreach ($mapping['joinTableColumns'] as $joinTableColumn) {
foreach ($mapping->joinTableColumns as $joinTableColumn) {
$isRelationToSource = isset($mapping['relationToSourceKeyColumns'][$joinTableColumn]);

if (! $isComposite) {
Expand Down Expand Up @@ -593,7 +595,8 @@ private function getJoinTableRestrictionsWithKey(
$types[] = PersisterHelper::getTypeOfColumn($columnName, $targetClass, $this->em);
}

foreach ($mapping['joinTableColumns'] as $joinTableColumn) {
assert($mapping->isManyToManyOwningSide());
foreach ($mapping->joinTableColumns as $joinTableColumn) {
if (isset($mapping[$sourceRelationMode][$joinTableColumn])) {
$column = $mapping[$sourceRelationMode][$joinTableColumn];
$whereClauses[] = 't.' . $joinTableColumn . ' = ?';
Expand Down Expand Up @@ -659,7 +662,8 @@ private function getJoinTableRestrictions(
$params = [];
$types = [];

foreach ($mapping['joinTableColumns'] as $joinTableColumn) {
assert($mapping->isManyToManyOwningSide());
foreach ($mapping->joinTableColumns as $joinTableColumn) {
$whereClauses[] = ($addFilters ? 't.' : '') . $joinTableColumn . ' = ?';

if (isset($mapping['relationToTargetKeyColumns'][$joinTableColumn])) {
Expand Down
4 changes: 4 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ parameters:
message: "#^Access to an undefined property Doctrine\\\\ORM\\\\Mapping\\\\ToOneAssociationMapping\\:\\:\\$joinColumns\\.$#"
path: lib/Doctrine/ORM/Mapping/ToOneAssociationMapping.php

-
message: "#^Access to an undefined property Doctrine\\\\ORM\\\\Mapping\\\\AssociationMapping\\:\\:\\$joinTableColumns\\.$#"
path: lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php

-
message: "#^Method Doctrine\\\\ORM\\\\Mapping\\\\ToOneAssociationMapping\\:\\:fromMappingArrayAndName\\(\\) should return Doctrine\\\\ORM\\\\Mapping\\\\ManyToOneAssociationMapping\\|Doctrine\\\\ORM\\\\Mapping\\\\OneToOneAssociationMapping but returns static\\(Doctrine\\\\ORM\\\\Mapping\\\\ToOneAssociationMapping\\)\\.$#"
path: lib/Doctrine/ORM/Mapping/ToOneAssociationMapping.php
Expand Down
2 changes: 0 additions & 2 deletions tests/Doctrine/Tests/ORM/Mapping/AssociationMappingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ public function testItSurvivesSerialization(): void
$mapping->id = true;
$mapping->isOnDeleteCascade = true;
$mapping->joinColumnFieldNames = ['foo' => 'bar'];
$mapping->joinTableColumns = ['foo', 'bar'];
$mapping->originalClass = self::class;
$mapping->originalField = 'foo';
$mapping->orphanRemoval = true;
Expand All @@ -52,7 +51,6 @@ public function testItSurvivesSerialization(): void
self::assertTrue($resurrectedMapping->id);
self::assertTrue($resurrectedMapping->isOnDeleteCascade);
self::assertSame(['foo' => 'bar'], $resurrectedMapping->joinColumnFieldNames);
self::assertSame(['foo', 'bar'], $resurrectedMapping->joinTableColumns);
self::assertSame(self::class, $resurrectedMapping->originalClass);
self::assertSame('foo', $resurrectedMapping->originalField);
self::assertTrue($resurrectedMapping->orphanRemoval);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@ public function testItSurvivesSerialization(): void
targetEntity: self::class,
);

$mapping->joinTable = new JoinTableMapping();
$mapping->joinTable->name = 'bar';
$mapping->joinTable = new JoinTableMapping();
$mapping->joinTable->name = 'bar';
$mapping->joinTableColumns = ['foo', 'bar'];

$resurrectedMapping = unserialize(serialize($mapping));
assert($resurrectedMapping instanceof ManyToManyOwningSideMapping);

self::assertSame($resurrectedMapping->joinTable->name, 'bar');
self::assertSame(['foo', 'bar'], $resurrectedMapping->joinTableColumns);
}
}

0 comments on commit 49cc83d

Please sign in to comment.