Dan Morphis
Dan Morphis

Reputation: 1727

Doctrine refresh copy of entity

I have a CustomerAccount entity. After that entity has had changes made to it via a form, but before the entity has been persisted to the database, I need to fetch a new copy of the same CustomerAccount with the entity as it currently exists in the database. The reason I need to do this is I want to fire off a changed event with both the old and new data in my service.

One hack I used was $oldAccount = unserialize(serialize($account)); and passing the old into my service, but thats really hackish.

What I would really like to do is have Doctrine pull back a copy of the original entity (while keeping the changes to the new version).

Is this even possible?

Update

It appears what I really want to do is ultimately impossible at this time with the way Doctrine is architected.

Update 2

I added the solution I ultimately ended up using at the bottom. I'm not completely happy with it because it feels hackish, but it gets the job done and allows me to move on.

Upvotes: 2

Views: 1867

Answers (2)

Dan Morphis
Dan Morphis

Reputation: 1727

Here is the ultimate solution I ended up using. I created a duplicate entity manager in my config.yml and retrieved a second copy of the entity from the duplicate entity manager. Because I won't make any changes to the entity retrieved by the duplicate entity manager, this solution was the best for my use case.

Upvotes: 3

DonCallisto
DonCallisto

Reputation: 29932

It depends.

I mean, Doctrine2 use the IdentityMap that prevents you "accidentally" query the db for the same object over and over again into the same request. The only way to force doctrine fetch entity object again is to detach the entity from the entity manager and request entity again.

This, however, could lead to some strange behaviour that could "slip" out of your control:

  • you can't persist again a detached object
  • if you try to persist an object that is related ("linked") to your detached entity you will run into troubles (and sometimes is very difficult to debug)

So, why don't you try with php built-in clone function? Maybe is more suitable for you and could save you from a lot of debugging

Code example:

$em = $this->getDoctrine()->getManager();
$fetched_entity = $em->findOnById(12);
$cloned_entity = clone $fetched_entity;
//and so on ...

Upvotes: 3

Related Questions