3

I'm working on a tool for concurrency with Doctrine 2.

I'm facing a "best practice" issue to retrieve a new instance of an entity without cache (the idea after that is to be able to compare some properties from 2 differents objects of the same entity and return the differences)

Some code might help (+ the doc: (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html)):

// This is my current implementation.

$entity = $em->find(1);
$entity->setName('TEST');
// This entity as a "version" field equal to 2 in DB for example 

try {
    $em->lock($entity, LockMode::OPTIMISTIC, 1); // Will throw an OptimisticLockException
} catch(OptimisticLockException $e) {
    $em->detach($entity);

    $dbEntity = $this->find($entity->getId());

    $em->detach($dbEntity);

    $entity = $em->merge($entity);

    var_dump($entity->getName()); // TEST
    var_dump($dbEntity->getName()); // The old value

    ... do more stuff, like comparing the two objects ...
}

Is using the detach + merge methods a good practice for this behavior ? Any better idea to improve this code ?

-- Edit 1:

Actually, after adding some tests, the "merge" method is not what I expected: the object is not "re-attach" to the unit of work.

This behaviour is not what I want because the developer can't performs changes + flush on his entity after using my tool.

-- Edit 2:

After digging in the documentation and the source code, the "merge" method is actually what I wanted: a new instance of the entity is attached, not the one I provided ($entity in my example).

Since this code (In my tool) is in a method which purpose is to returns the $dbEntity object of my $entity object, passing the $entity reference (&$entity) solve my "Edit 1" issue.

fsevestre
  • 121
  • 1
  • 8

0 Answers0