diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index e3da55bdf..61328cdac 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -1852,7 +1852,7 @@ class ClassMetadataInfo implements ClassMetadata */ public function hasField($fieldName) { - return isset($this->fieldMappings[$fieldName]); + return isset($this->fieldMappings[$fieldName]) || isset($this->embeddedClasses[$fieldName]); } /** diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6460Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6460Test.php new file mode 100644 index 000000000..9868c7d1c --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6460Test.php @@ -0,0 +1,111 @@ +setUpEntitySchema( + [ + DDC6460Entity::class, + DDC6460ParentEntity::class, + ] + ); + } catch (SchemaException $e) { + } + } + + /** + * @group DDC-6460 + */ + public function testInlineEmbeddable() + { + $isFieldMapped = $this->_em + ->getClassMetadata(DDC6460Entity::class) + ->hasField('embedded'); + + $this->assertTrue($isFieldMapped); + } + + /** + * @group DDC-6460 + */ + public function testInlineEmbeddableProxyInitialization() + { + $entity = new DDC6460Entity(); + $entity->id = 1; + $entity->embedded = new DDC6460Embeddable(); + $entity->embedded->field = 'test'; + $this->_em->persist($entity); + + $second = new DDC6460ParentEntity(); + $second->id = 1; + $second->lazyLoaded = $entity; + $this->_em->persist($second); + $this->_em->flush(); + + $this->_em->clear(); + + $secondEntityWithLazyParameter = $this->_em->getRepository(DDC6460ParentEntity::class)->findOneById(1); + + $this->assertInstanceOf(Proxy::class, $secondEntityWithLazyParameter->lazyLoaded); + $this->assertInstanceOf(DDC6460Entity::class, $secondEntityWithLazyParameter->lazyLoaded); + $this->assertFalse($secondEntityWithLazyParameter->lazyLoaded->__isInitialized()); + $this->assertEquals($secondEntityWithLazyParameter->lazyLoaded->embedded, $entity->embedded); + $this->assertTrue($secondEntityWithLazyParameter->lazyLoaded->__isInitialized()); + } +} + +/** + * @Embeddable() + */ +class DDC6460Embeddable +{ + /** @Column(type="string") */ + public $field; +} + +/** + * @Entity() + */ +class DDC6460Entity +{ + /** + * @Id + * @GeneratedValue(strategy = "NONE") + * @Column(type = "integer") + */ + public $id; + + /** @Embedded(class = "DDC6460Embeddable") */ + public $embedded; +} + +/** + * @Entity() + */ +class DDC6460ParentEntity +{ + /** + * @Id + * @GeneratedValue(strategy = "NONE") + * @Column(type = "integer") + */ + public $id; + + /** @ManyToOne(targetEntity = "DDC6460Entity", fetch="EXTRA_LAZY", cascade={"persist"}) */ + public $lazyLoaded; +} diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 734ea8547..24d9559f7 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -1269,6 +1269,24 @@ class ClassMetadataTest extends OrmTestCase self::assertSame(['foo', 'baz'], $metadata->getColumnNames(['status', 'name'])); } + + /** + * @group DDC-6460 + */ + public function testInlineEmbeddable() + { + $classMetadata = new ClassMetadata(TestEntity1::class); + + $classMetadata->mapEmbedded( + [ + 'fieldName' => 'test', + 'class' => TestEntity1::class, + 'columnPrefix' => false, + ] + ); + + $this->assertTrue($classMetadata->hasField('test')); + } } /**