Skip to content

Commit

Permalink
[doctrineGH-6394] Bugfix: IdentifierFlattener support for association…
Browse files Browse the repository at this point in the history
… non-object values
  • Loading branch information
beberlei committed Dec 8, 2020
1 parent 21d2c88 commit 66a95ea
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 2 deletions.
6 changes: 4 additions & 2 deletions lib/Doctrine/ORM/Utility/IdentifierFlattener.php
Expand Up @@ -71,13 +71,15 @@ public function flattenIdentifier(ClassMetadata $class, array $id)
$flatId = [];

foreach ($class->identifier as $field) {
if (isset($class->associationMappings[$field]) && isset($id[$field]) && is_object($id[$field])) {
if (isset($class->associationMappings[$field]) && isset($id[$field])) {
/* @var $targetClassMetadata ClassMetadata */
$targetClassMetadata = $this->metadataFactory->getMetadataFor(
$class->associationMappings[$field]['targetEntity']
);

if ($this->unitOfWork->isInIdentityMap($id[$field])) {
if (!is_object($id[$field])) {
$associatedId = [$id[$field]];
} elseif ($this->unitOfWork->isInIdentityMap($id[$field])) {
$associatedId = $this->flattenIdentifier($targetClassMetadata, $this->unitOfWork->getEntityIdentifier($id[$field]));
} else {
$associatedId = $this->flattenIdentifier($targetClassMetadata, $targetClassMetadata->getIdentifierValues($id[$field]));
Expand Down
99 changes: 99 additions & 0 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/GH6394Test.php
@@ -0,0 +1,99 @@
<?php

namespace Doctrine\Tests\ORM\Functional\Ticket;

class GH6394Test extends \Doctrine\Tests\OrmFunctionalTestCase
{

protected function setUp(): void
{
parent::setUp();

$this->_schemaTool->createSchema(
[
$this->_em->getClassMetadata(A::class),
$this->_em->getClassMetadata(B::class)
]
);
}

/**
* Test the the version of an entity can be fetched, when the id field and
* the id column are different.
* @group 6393
*/
public function testFetchVersionValueForDifferentIdFieldAndColumn(): void
{
$a = new A(1);
$this->_em->persist($a);

$b = new B($a, 'foo');
$this->_em->persist($b);
$this->_em->flush();

self::assertSame(1, $b->version);

$b->something = 'bar';
$this->_em->flush();

self::assertSame(2, $b->version);
}

}

/**
* @Entity
*/
class A
{

/**
* @Id
* @Column(type="integer")
*/
public $id;

/**
* @Version
* @Column(type="integer")
*/
public $version;

public function __construct(int $id)
{
$this->id = $id;
}

}

/**
* @Entity
*/
class B
{

/**
* @Id
* @ManyToOne(targetEntity="A")
* @JoinColumn(name="aid", referencedColumnName="id")
*/
public $a;

/**
* @Column(type="string")
*/
public $something;

/**
* @Version
* @Column(type="integer")
*/
public $version;

public function __construct(A $a, string $something)
{
$this->a = $a;
$this->something = $something;
}

}

0 comments on commit 66a95ea

Please sign in to comment.