Skip to content

Commit

Permalink
Merge pull request #6462 from mkosiedowski/proxy-embedded-fields-fix
Browse files Browse the repository at this point in the history
Fix #6460 - \Doctrine\ORM\Mapping\ClassMetadataInfo::hasField should return true for embedded fields
  • Loading branch information
Ocramius committed Jun 1, 2017
2 parents 22ecc2d + 76f0fe4 commit 971c400
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php
Original file line number Diff line number Diff line change
Expand Up @@ -1852,7 +1852,7 @@ public function getIdentifier()
*/
public function hasField($fieldName)
{
return isset($this->fieldMappings[$fieldName]);
return isset($this->fieldMappings[$fieldName]) || isset($this->embeddedClasses[$fieldName]);
}

/**
Expand Down
111 changes: 111 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/DDC6460Test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Id;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Proxy\Proxy;

class DDC6460Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
public function setUp()
{
parent::setUp();

try {
$this->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;
}
18 changes: 18 additions & 0 deletions tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1269,6 +1269,24 @@ public function testGetColumnNamesWithGivenFieldNames()

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'));
}
}

/**
Expand Down

0 comments on commit 971c400

Please sign in to comment.