From 472eab11e9a9bafc5510d6b02b7c22d6cb525c50 Mon Sep 17 00:00:00 2001 From: victor Date: Thu, 31 Dec 2020 17:00:14 +1100 Subject: [PATCH] [DoctrineBridge] Take into account that indexBy="person_id" could be a db column name, for a referenced entity --- .../Doctrine/PropertyInfo/DoctrineExtractor.php | 7 ++++++- .../Tests/PropertyInfo/DoctrineExtractorTest.php | 10 ++++++++++ .../Tests/PropertyInfo/Fixtures/DoctrineDummy.php | 5 +++++ .../PropertyInfo/Fixtures/DoctrineGeneratedValue.php | 12 ++++++++++++ .../Tests/PropertyInfo/Fixtures/DoctrineRelation.php | 12 ++++++++++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index ddac6cb379..a0459aa970 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -122,7 +122,12 @@ class DoctrineExtractor implements PropertyListExtractorInterface, PropertyTypeE /** @var ClassMetadataInfo $subMetadata */ $indexProperty = $subMetadata->getSingleAssociationReferencedJoinColumnName($fieldName); $subMetadata = $this->entityManager ? $this->entityManager->getClassMetadata($associationMapping['targetEntity']) : $this->classMetadataFactory->getMetadataFor($associationMapping['targetEntity']); - $typeOfField = $subMetadata->getTypeOfField($indexProperty); + + //Not a property, maybe a column name? + if (null === ($typeOfField = $subMetadata->getTypeOfField($indexProperty))) { + $fieldName = $subMetadata->getFieldForColumn($indexProperty); + $typeOfField = $subMetadata->getTypeOfField($fieldName); + } } } diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index c96c594181..7e256eb77e 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -85,6 +85,7 @@ class DoctrineExtractorTest extends TestCase 'indexedByDt', 'indexedByCustomType', 'indexedBuz', + 'dummyGeneratedValueList', ]); $this->assertEquals( @@ -245,6 +246,15 @@ class DoctrineExtractorTest extends TestCase new Type(Type::BUILTIN_TYPE_STRING), new Type(Type::BUILTIN_TYPE_OBJECT, false, DoctrineRelation::class) )]], + ['dummyGeneratedValueList', [new Type( + Type::BUILTIN_TYPE_OBJECT, + false, + 'Doctrine\Common\Collections\Collection', + true, + new Type(Type::BUILTIN_TYPE_INT), + new Type(Type::BUILTIN_TYPE_OBJECT, false, DoctrineRelation::class) + )]], + ['json', null], ]; if (class_exists(Types::class)) { diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineDummy.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineDummy.php index a065dc49cd..67d61f2abf 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineDummy.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineDummy.php @@ -137,4 +137,9 @@ class DoctrineDummy * @OneToMany(targetEntity="DoctrineRelation", mappedBy="buzField", indexBy="buzField") */ protected $indexedBuz; + + /** + * @OneToMany(targetEntity="DoctrineRelation", mappedBy="dummyRelation", indexBy="gen_value_col_id", orphanRemoval=true) + */ + protected $dummyGeneratedValueList; } diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineGeneratedValue.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineGeneratedValue.php index 8418b5e591..9e7612fa35 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineGeneratedValue.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineGeneratedValue.php @@ -15,6 +15,7 @@ use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Mapping\GeneratedValue; use Doctrine\ORM\Mapping\Id; +use Doctrine\ORM\Mapping\OneToMany; /** * @author Kévin Dunglas @@ -34,4 +35,15 @@ class DoctrineGeneratedValue * @Column */ public $foo; + + /** + * @var int + * @Column(type="integer", name="gen_value_col_id") + */ + public $valueId; + + /** + * @OneToMany(targetEntity="DoctrineRelation", mappedBy="generatedValueRelation", indexBy="rguid_column", orphanRemoval=true) + */ + protected $relationList; } diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineRelation.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineRelation.php index d6d9af6d70..61a658096a 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineRelation.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineRelation.php @@ -15,6 +15,7 @@ use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Mapping\Id; use Doctrine\ORM\Mapping\ManyToOne; +use Doctrine\ORM\Mapping\JoinColumn; /** * @Entity @@ -60,4 +61,15 @@ class DoctrineRelation * @ManyToOne(targetEntity="DoctrineDummy", inversedBy="indexedBuz") */ protected $buzField; + + /** + * @ManyToOne(targetEntity="DoctrineDummy", inversedBy="dummyGeneratedValueList") + */ + private $dummyRelation; + + /** + * @ManyToOne(targetEntity="DoctrineGeneratedValue", inversedBy="relationList") + * @JoinColumn(name="gen_value_col_id", referencedColumnName="gen_value_col_id") + */ + private $generatedValueRelation; }