Skip to content

Commit

Permalink
[doctrineGH-6394] Bugfix: BasicEntityPersister::update used wrong ide…
Browse files Browse the repository at this point in the history
…ntifiers for version assignment.
  • Loading branch information
beberlei committed Dec 8, 2020
1 parent 66a95ea commit b621e77
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 15 deletions.
Expand Up @@ -394,7 +394,7 @@ public function update($entity)
$this->updateTable($entity, $quotedTableName, $data, $isVersioned);

if ($isVersioned) {
$id = $this->em->getUnitOfWork()->getEntityIdentifier($entity);
$id = $this->class->getIdentifierValues($entity);

$this->assignDefaultVersionValue($entity, $id);
}
Expand Down
6 changes: 2 additions & 4 deletions lib/Doctrine/ORM/Utility/IdentifierFlattener.php
Expand Up @@ -71,15 +71,13 @@ public function flattenIdentifier(ClassMetadata $class, array $id)
$flatId = [];

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

if (!is_object($id[$field])) {
$associatedId = [$id[$field]];
} elseif ($this->unitOfWork->isInIdentityMap($id[$field])) {
if ($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
24 changes: 14 additions & 10 deletions tests/Doctrine/Tests/ORM/Functional/Ticket/GH6394Test.php
@@ -1,25 +1,29 @@
<?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

class GH6394Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
use Doctrine\Tests\OrmFunctionalTestCase;

class GH6394Test extends OrmFunctionalTestCase
{
protected function setUp(): void
{
parent::setUp();

$this->_schemaTool->createSchema(
[
$this->_em->getClassMetadata(A::class),
$this->_em->getClassMetadata(B::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
Expand All @@ -38,62 +42,62 @@ public function testFetchVersionValueForDifferentIdFieldAndColumn(): void

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

}

/**
* @Entity
*/
class A
{

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

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

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

}

/**
* @Entity
*/
class B
{

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

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

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

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

}
}

0 comments on commit b621e77

Please sign in to comment.