Skip to content

Commit 37c8953

Browse files
authored
Merge pull request doctrine#10678 from doctrine/2.15.x
Merge 2.15.x up into 2.16.x
2 parents a199ca3 + 60c625b commit 37c8953

File tree

7 files changed

+114
-84
lines changed

7 files changed

+114
-84
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"symfony/cache": "^4.4 || ^5.4 || ^6.0",
5050
"symfony/var-exporter": "^4.4 || ^5.4 || ^6.2",
5151
"symfony/yaml": "^3.4 || ^4.0 || ^5.0 || ^6.0",
52-
"vimeo/psalm": "4.30.0 || 5.9.0"
52+
"vimeo/psalm": "4.30.0 || 5.11.0"
5353
},
5454
"conflict": {
5555
"doctrine/annotations": "<1.13 || >= 3.0"

lib/Doctrine/ORM/Mapping/Driver/AttributeDriver.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,14 @@ public function loadMetadataForClass($className, PersistenceClassMetadata $metad
437437
if ($joinTableAttribute->options) {
438438
$joinTable['options'] = $joinTableAttribute->options;
439439
}
440+
441+
foreach ($joinTableAttribute->joinColumns as $joinColumn) {
442+
$joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn);
443+
}
444+
445+
foreach ($joinTableAttribute->inverseJoinColumns as $joinColumn) {
446+
$joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn);
447+
}
440448
}
441449

442450
foreach ($this->reader->getPropertyAttributeCollection($property, Mapping\JoinColumn::class) as $joinColumn) {

lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,7 @@ protected function loadMappingFile($file)
989989
$result = [];
990990
// Note: we do not use `simplexml_load_file()` because of https://bugs.php.net/bug.php?id=62577
991991
$xmlElement = simplexml_load_string(file_get_contents($file));
992+
assert($xmlElement !== false);
992993

993994
if (isset($xmlElement->entity)) {
994995
foreach ($xmlElement->entity as $entityElement) {

psalm-baseline.xml

Lines changed: 33 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<files psalm-version="5.9.0@8b9ad1eb9e8b7d3101f949291da2b9f7767cd163">
2+
<files psalm-version="5.11.0@c9b192ab8400fdaf04b2b13d110575adc879aa90">
33
<file src="lib/Doctrine/ORM/AbstractQuery.php">
44
<DeprecatedClass>
55
<code>IterableResult</code>
@@ -458,6 +458,9 @@
458458
</RedundantConditionGivenDocblockType>
459459
</file>
460460
<file src="lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php">
461+
<InvalidArgument>
462+
<code>$element</code>
463+
</InvalidArgument>
461464
<PossiblyFalseArgument>
462465
<code>$index</code>
463466
</PossiblyFalseArgument>
@@ -610,17 +613,14 @@
610613
<code><![CDATA[$this->subClasses]]></code>
611614
</InvalidPropertyAssignmentValue>
612615
<InvalidReturnStatement>
613-
<code>$mapping</code>
614616
<code>$mapping</code>
615617
<code><![CDATA[$this->reflClass]]></code>
616618
</InvalidReturnStatement>
617619
<InvalidReturnType>
618620
<code>AssociationMapping</code>
619-
<code>FieldMapping</code>
620621
<code>getReflectionClass</code>
621622
</InvalidReturnType>
622623
<LessSpecificReturnStatement>
623-
<code>$cache</code>
624624
<code>$className</code>
625625
<code>$className</code>
626626
<code>$columnNames</code>
@@ -632,8 +632,7 @@
632632
<code>__toString</code>
633633
</MethodSignatureMustProvideReturnType>
634634
<MoreSpecificReturnType>
635-
<code>AssociationMapping</code>
636-
<code>array{usage: int, region: string|null}</code>
635+
<code>FieldMapping</code>
637636
<code>class-string|null</code>
638637
<code><![CDATA[list<string>]]></code>
639638
<code><![CDATA[list<string>]]></code>
@@ -743,12 +742,12 @@
743742
</PossiblyUndefinedArrayOffset>
744743
</file>
745744
<file src="lib/Doctrine/ORM/Mapping/DefaultTypedFieldMapper.php">
746-
<InvalidReturnStatement>
745+
<LessSpecificReturnStatement>
747746
<code>$mapping</code>
748-
</InvalidReturnStatement>
749-
<InvalidReturnType>
747+
</LessSpecificReturnStatement>
748+
<MoreSpecificReturnType>
750749
<code>array</code>
751-
</InvalidReturnType>
750+
</MoreSpecificReturnType>
752751
<PropertyTypeCoercion>
753752
<code>array_merge(self::DEFAULT_TYPED_FIELD_MAPPINGS, $typedFieldMappings)</code>
754753
</PropertyTypeCoercion>
@@ -914,8 +913,18 @@
914913
<InvalidPropertyAssignmentValue>
915914
<code><![CDATA[$metadata->table]]></code>
916915
</InvalidPropertyAssignmentValue>
916+
<InvalidPropertyFetch>
917+
<code><![CDATA[$indexXml->options]]></code>
918+
<code><![CDATA[$uniqueXml->options]]></code>
919+
<code><![CDATA[$xmlRoot->{'discriminator-column'}]]></code>
920+
<code><![CDATA[$xmlRoot->{'discriminator-map'}]]></code>
921+
</InvalidPropertyFetch>
917922
<InvalidReturnStatement>
918923
<code>$mapping</code>
924+
<code><![CDATA[[
925+
'usage' => $usage,
926+
'region' => $region,
927+
]]]></code>
919928
</InvalidReturnStatement>
920929
<InvalidReturnType>
921930
<code>array{
@@ -934,74 +943,48 @@
934943
* columnDefinition?: string,
935944
* options?: array
936945
* }</code>
946+
<code>array{usage: int|null, region?: string}</code>
937947
</InvalidReturnType>
938-
<LessSpecificReturnStatement>
939-
<code><![CDATA[[
940-
'usage' => $usage,
941-
'region' => $region,
942-
]]]></code>
943-
</LessSpecificReturnStatement>
944948
<MissingParamType>
945949
<code>$fileExtension</code>
946950
<code>$locator</code>
947951
</MissingParamType>
948952
<MoreSpecificImplementedParamType>
949953
<code>$metadata</code>
950954
</MoreSpecificImplementedParamType>
951-
<MoreSpecificReturnType>
952-
<code>array{usage: int|null, region?: string}</code>
953-
</MoreSpecificReturnType>
954955
<NoInterfaceProperties>
955956
<code><![CDATA[$indexXml->options]]></code>
956957
<code><![CDATA[$uniqueXml->options]]></code>
957958
<code><![CDATA[$xmlRoot->{'discriminator-column'}]]></code>
958959
<code><![CDATA[$xmlRoot->{'discriminator-map'}]]></code>
959960
</NoInterfaceProperties>
960-
<PossiblyInvalidPropertyFetch>
961-
<code><![CDATA[$indexXml->options]]></code>
962-
<code><![CDATA[$uniqueXml->options]]></code>
963-
<code><![CDATA[$xmlRoot->{'discriminator-column'}]]></code>
964-
<code><![CDATA[$xmlRoot->{'discriminator-map'}]]></code>
965-
</PossiblyInvalidPropertyFetch>
966-
<RedundantCondition>
967-
<code><![CDATA[isset($xmlRoot->cache)]]></code>
968-
<code><![CDATA[isset($xmlRoot->embedded)]]></code>
969-
<code><![CDATA[isset($xmlRoot->field)]]></code>
970-
<code><![CDATA[isset($xmlRoot->indexes)]]></code>
971-
<code><![CDATA[isset($xmlRoot->options)]]></code>
972-
<code><![CDATA[isset($xmlRoot->{'association-overrides'})]]></code>
973-
<code><![CDATA[isset($xmlRoot->{'attribute-overrides'})]]></code>
974-
<code><![CDATA[isset($xmlRoot->{'entity-listeners'})]]></code>
975-
<code><![CDATA[isset($xmlRoot->{'lifecycle-callbacks'})]]></code>
976-
<code><![CDATA[isset($xmlRoot->{'many-to-many'})]]></code>
977-
<code><![CDATA[isset($xmlRoot->{'many-to-one'})]]></code>
978-
<code><![CDATA[isset($xmlRoot->{'named-native-queries'})]]></code>
979-
<code><![CDATA[isset($xmlRoot->{'named-queries'})]]></code>
980-
<code><![CDATA[isset($xmlRoot->{'one-to-many'})]]></code>
981-
<code><![CDATA[isset($xmlRoot->{'one-to-one'})]]></code>
982-
<code><![CDATA[isset($xmlRoot->{'sql-result-set-mappings'})]]></code>
983-
<code><![CDATA[isset($xmlRoot->{'unique-constraints'})]]></code>
984-
</RedundantCondition>
961+
<PossiblyNullArgument>
962+
<code><![CDATA[$joinColumnElement['options']->children()]]></code>
963+
<code><![CDATA[$option->children()]]></code>
964+
</PossiblyNullArgument>
965+
<PossiblyNullIterator>
966+
<code><![CDATA[$cascadeElement->children()]]></code>
967+
</PossiblyNullIterator>
985968
<TypeDoesNotContainType>
986969
<code><![CDATA[$xmlRoot->getName() === 'embeddable']]></code>
987970
<code><![CDATA[$xmlRoot->getName() === 'entity']]></code>
988971
<code><![CDATA[$xmlRoot->getName() === 'mapped-superclass']]></code>
989972
</TypeDoesNotContainType>
990973
</file>
991974
<file src="lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php">
992-
<DeprecatedMethod>
993-
<code>addNamedNativeQuery</code>
994-
<code>addNamedQuery</code>
995-
</DeprecatedMethod>
996-
<InvalidArgument>
975+
<ArgumentTypeCoercion>
997976
<code><![CDATA[[
998977
'name' => isset($discrColumn['name']) ? (string) $discrColumn['name'] : null,
999978
'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : 'string',
1000979
'length' => isset($discrColumn['length']) ? (int) $discrColumn['length'] : 255,
1001980
'columnDefinition' => isset($discrColumn['columnDefinition']) ? (string) $discrColumn['columnDefinition'] : null,
1002981
'enumType' => isset($discrColumn['enumType']) ? (string) $discrColumn['enumType'] : null,
1003982
]]]></code>
1004-
</InvalidArgument>
983+
</ArgumentTypeCoercion>
984+
<DeprecatedMethod>
985+
<code>addNamedNativeQuery</code>
986+
<code>addNamedQuery</code>
987+
</DeprecatedMethod>
1005988
<LessSpecificReturnStatement>
1006989
<code><![CDATA[[
1007990
'usage' => $usage,
@@ -1038,9 +1021,6 @@
10381021
<code>$element</code>
10391022
<code>$element</code>
10401023
</PossiblyUndefinedMethod>
1041-
<PropertyTypeCoercion>
1042-
<code><![CDATA[$metadata->table]]></code>
1043-
</PropertyTypeCoercion>
10441024
<UndefinedInterfaceMethod>
10451025
<code>$element</code>
10461026
<code>$element</code>
@@ -1302,15 +1282,13 @@
13021282
</InvalidNullableReturnType>
13031283
<LessSpecificReturnStatement>
13041284
<code>$newValue</code>
1305-
<code>$postInsertIds</code>
13061285
<code>[$params, $types]</code>
13071286
<code>[$sqlParams, $sqlTypes]</code>
13081287
</LessSpecificReturnStatement>
13091288
<MissingReturnType>
13101289
<code>loadAll</code>
13111290
</MissingReturnType>
13121291
<MoreSpecificReturnType>
1313-
<code>executeInserts</code>
13141292
<code>expandCriteriaParameters</code>
13151293
<code>expandParameters</code>
13161294
<code><![CDATA[list<mixed>]]></code>
@@ -1394,12 +1372,6 @@
13941372
</MissingReturnType>
13951373
</file>
13961374
<file src="lib/Doctrine/ORM/Persisters/Entity/JoinedSubclassPersister.php">
1397-
<LessSpecificReturnStatement>
1398-
<code>$postInsertIds</code>
1399-
</LessSpecificReturnStatement>
1400-
<MoreSpecificReturnType>
1401-
<code>executeInserts</code>
1402-
</MoreSpecificReturnType>
14031375
<PossiblyUndefinedArrayOffset>
14041376
<code><![CDATA[$assoc['targetToSourceKeyColumns']]]></code>
14051377
<code><![CDATA[$mapping['joinColumns']]]></code>
@@ -1937,9 +1909,6 @@
19371909
<MethodSignatureMustProvideReturnType>
19381910
<code>__toString</code>
19391911
</MethodSignatureMustProvideReturnType>
1940-
<PropertyTypeCoercion>
1941-
<code><![CDATA[$this->parts]]></code>
1942-
</PropertyTypeCoercion>
19431912
</file>
19441913
<file src="lib/Doctrine/ORM/Query/Expr/Comparison.php">
19451914
<MethodSignatureMustProvideReturnType>
@@ -2292,10 +2261,6 @@
22922261
</file>
22932262
<file src="lib/Doctrine/ORM/QueryBuilder.php">
22942263
<ArgumentTypeCoercion>
2295-
<code>$args</code>
2296-
<code>$args</code>
2297-
<code>$args</code>
2298-
<code>$args</code>
22992264
<code><![CDATA[[$rootAlias => $join]]]></code>
23002265
<code><![CDATA[[$rootAlias => $join]]]></code>
23012266
</ArgumentTypeCoercion>
@@ -2312,17 +2277,9 @@
23122277
<InvalidPropertyAssignmentValue>
23132278
<code>new ArrayCollection($parameters)</code>
23142279
</InvalidPropertyAssignmentValue>
2315-
<LessSpecificReturnStatement>
2316-
<code>$aliases</code>
2317-
<code>$entities</code>
2318-
</LessSpecificReturnStatement>
23192280
<MethodSignatureMustProvideReturnType>
23202281
<code>__toString</code>
23212282
</MethodSignatureMustProvideReturnType>
2322-
<MoreSpecificReturnType>
2323-
<code><![CDATA[list<string>]]></code>
2324-
<code><![CDATA[list<string>]]></code>
2325-
</MoreSpecificReturnType>
23262283
<PossiblyFalseArgument>
23272284
<code>$spacePos</code>
23282285
<code>$spacePos</code>
@@ -2621,9 +2578,6 @@
26212578
<PossiblyFalseArgument>
26222579
<code><![CDATA[$simpleXml->asXML()]]></code>
26232580
</PossiblyFalseArgument>
2624-
<PossiblyNullReference>
2625-
<code>addAttribute</code>
2626-
</PossiblyNullReference>
26272581
<RedundantCondition>
26282582
<code><![CDATA[$field['associationKey']]]></code>
26292583
<code><![CDATA[isset($field['associationKey']) && $field['associationKey']]]></code>
@@ -2863,9 +2817,6 @@
28632817
<code>unwrap</code>
28642818
<code>unwrap</code>
28652819
</PossiblyUndefinedMethod>
2866-
<PropertyTypeCoercion>
2867-
<code><![CDATA[$this->nonCascadedNewDetectedEntities]]></code>
2868-
</PropertyTypeCoercion>
28692820
<RedundantCondition>
28702821
<code><![CDATA[$i >= 0 && $this->entityDeletions]]></code>
28712822
<code><![CDATA[$this->entityDeletions]]></code>

psalm.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
<file name="lib/Doctrine/ORM/Mapping/Driver/AttributeReader.php" />
1919
</ignoreFiles>
2020
</projectFiles>
21+
<enableExtensions>
22+
<extension name="simplexml" />
23+
</enableExtensions>
2124
<issueHandlers>
2225
<DeprecatedClass>
2326
<errorLevel type="suppress">

tests/Doctrine/Tests/ORM/Mapping/AttributeDriverTest.php

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
namespace Doctrine\Tests\ORM\Mapping;
66

77
use Attribute;
8+
use Doctrine\Common\Collections\Collection;
89
use Doctrine\ORM\Mapping as ORM;
910
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
1011
use Doctrine\ORM\Mapping\MappingAttribute;
1112
use Doctrine\Persistence\Mapping\Driver\AnnotationDriver as PersistenceAnnotationDriver;
1213
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
14+
use Doctrine\Tests\ORM\Mapping\Fixtures\AttributeEntityWithNestedJoinColumns;
1315
use stdClass;
1416

1517
use function class_exists;
@@ -123,6 +125,44 @@ public function testLegacyInheritance(): void
123125

124126
self::assertTrue(is_subclass_of(AttributeDriver::class, PersistenceAnnotationDriver::class));
125127
}
128+
129+
/**
130+
* @requires PHP 8.1
131+
*/
132+
public function testManyToManyAssociationWithNestedJoinColumns(): void
133+
{
134+
$factory = $this->createClassMetadataFactory();
135+
136+
$metadata = $factory->getMetadataFor(AttributeEntityWithNestedJoinColumns::class);
137+
138+
self::assertEquals(
139+
[
140+
[
141+
'name' => 'assoz_id',
142+
'referencedColumnName' => 'assoz_id',
143+
'unique' => false,
144+
'nullable' => true,
145+
'onDelete' => null,
146+
'columnDefinition' => null,
147+
],
148+
],
149+
$metadata->associationMappings['assoc']['joinTable']['joinColumns']
150+
);
151+
152+
self::assertEquals(
153+
[
154+
[
155+
'name' => 'inverse_assoz_id',
156+
'referencedColumnName' => 'inverse_assoz_id',
157+
'unique' => false,
158+
'nullable' => true,
159+
'onDelete' => null,
160+
'columnDefinition' => null,
161+
],
162+
],
163+
$metadata->associationMappings['assoc']['joinTable']['inverseJoinColumns']
164+
);
165+
}
126166
}
127167

128168
#[ORM\Entity]
@@ -136,7 +176,7 @@ class AttributeEntityWithoutOriginalParents
136176
#[ORM\GeneratedValue]
137177
public $id;
138178

139-
/** @var AttributeEntityWithoutOriginalParents[] */
179+
/** @var Collection<AttributeEntityWithoutOriginalParents> */
140180
#[ORM\ManyToMany(targetEntity: self::class)]
141181
#[ORM\JoinColumn(name: 'assoz_id', referencedColumnName: 'assoz_id')]
142182
#[ORM\InverseJoinColumn(name: 'assoz_id', referencedColumnName: 'assoz_id')]

0 commit comments

Comments
 (0)