[DDC-2996] Fix bug in UnitOfWork#recomputeSingleEntityChangeSet
When calling UnitOfWork#recomputeSingleEntityChangeSet on an entity that didn't have a changeset before, the computation was ignored. This method however is suggested to be used in "onFlush" and "preFlush" events in the documentation. Also fix a bug where recomputeSingleEntityChangeSet was used before calculating a real changeset for an object.
This commit is contained in:
parent
cbf16f1cf8
commit
8b75e3563a
@ -909,6 +909,10 @@ class UnitOfWork implements PropertyChangedListener
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! isset($this->originalEntityData[$oid])) {
|
||||
throw new \RuntimeException('Cannot call recomputeSingleEntityChangeSet before computeChangeSet on an entity.');
|
||||
}
|
||||
|
||||
$originalData = $this->originalEntityData[$oid];
|
||||
$changeSet = array();
|
||||
|
||||
@ -921,11 +925,12 @@ class UnitOfWork implements PropertyChangedListener
|
||||
}
|
||||
|
||||
if ($changeSet) {
|
||||
if (isset($this->entityChangeSets[$oid])) {
|
||||
$this->entityChangeSets[$oid] = array_merge($this->entityChangeSets[$oid], $changeSet);
|
||||
}
|
||||
$this->entityChangeSets[$oid] = (isset($this->entityChangeSets[$oid]))
|
||||
? array_merge($this->entityChangeSets[$oid], $changeSet)
|
||||
: $changeSet;
|
||||
|
||||
$this->originalEntityData[$oid] = $actualData;
|
||||
$this->entityUpdates[$oid] = $entity;
|
||||
}
|
||||
}
|
||||
|
||||
|
90
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2996Test.php
Normal file
90
tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2996Test.php
Normal file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace Doctrine\Tests\ORM\Functional\Ticket;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\Event\LifecycleEventArgs;
|
||||
|
||||
/**
|
||||
* @group DDC-2996
|
||||
*/
|
||||
class DDC2996Test extends \Doctrine\Tests\OrmFunctionalTestCase
|
||||
{
|
||||
public function testIssue()
|
||||
{
|
||||
$this->_schemaTool->createSchema(array(
|
||||
$this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2996User'),
|
||||
$this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC2996UserPreference'),
|
||||
));
|
||||
|
||||
$pref = new DDC2996UserPreference();
|
||||
$pref->user = new DDC2996User();
|
||||
$pref->value = "foo";
|
||||
|
||||
$this->_em->persist($pref);
|
||||
$this->_em->persist($pref->user);
|
||||
$this->_em->flush();
|
||||
|
||||
$pref->value = "bar";
|
||||
$this->_em->flush();
|
||||
|
||||
$this->assertEquals(1, $pref->user->counter);
|
||||
|
||||
$this->_em->clear();
|
||||
|
||||
$pref = $this->_em->find(__NAMESPACE__ . '\\DDC2996UserPreference', $pref->id);
|
||||
$this->assertEquals(1, $pref->user->counter);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Entity
|
||||
*/
|
||||
class DDC2996User
|
||||
{
|
||||
/**
|
||||
* @Id @GeneratedValue @Column(type="integer")
|
||||
*/
|
||||
public $id;
|
||||
/**
|
||||
* @Column(type="integer")
|
||||
*/
|
||||
public $counter = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Entity @HasLifecycleCallbacks
|
||||
*/
|
||||
class DDC2996UserPreference
|
||||
{
|
||||
/**
|
||||
* @Id @GeneratedValue @Column(type="integer")
|
||||
*/
|
||||
public $id;
|
||||
/**
|
||||
* @Column(type="string")
|
||||
*/
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* @ManyToOne(targetEntity="DDC2996User")
|
||||
*/
|
||||
public $user;
|
||||
|
||||
/**
|
||||
* @PreFlush
|
||||
*/
|
||||
public function preFlush($event)
|
||||
{
|
||||
$em = $event->getEntityManager();
|
||||
$uow = $em->getUnitOfWork();
|
||||
|
||||
if ($uow->getOriginalEntityData($this->user)) {
|
||||
$this->user->counter++;
|
||||
$uow->recomputeSingleEntityChangeSet(
|
||||
$em->getClassMetadata(get_class($this->user)),
|
||||
$this->user
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@ -5,8 +5,6 @@ namespace Doctrine\Tests\ORM\Functional\Ticket;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\Event\LifecycleEventArgs;
|
||||
|
||||
require_once __DIR__ . '/../../../TestInit.php';
|
||||
|
||||
/**
|
||||
* @group DDC-3033
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user