How to pass an entity stored in session to new entity

I store an entity in session:

$equipoActividad = new EquiposActividades();
$equipoActividad->setEquipoControl($equipoControlExiste);
$actividadObj=$em->getRepository('AgcManagerBundle:Actividad')->findOneBy(array('idActividad'=>$idActividad));
$equipoActividad->setActividad($actividadObj);
$equipoActividad->setIdUsuario($user->getIdUser());
$tipoTransmision = new TipoTransmision();
$tipoTransmision->setIdTipoTransmision(0);
$protocolo = new Protocolo();
$protocolo->setIdProtocolo(0);
$equipoActividad->setTipoTransmision($tipoTransmision);
$equipoActividad->setProtocolo($protocolo);
$request->getSession()->set("equipoActividad", $equipoActividad);

After I store this entity into a new entity:

$equipoActividad = new EquiposActividades();
$equipoActividad = $request->getSession()->get("equipoActividad");

This is the error:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

UPDATE:

$equipoActividad = $request->getSession()->get("equipoActividad");
$equipoActividad = $em->merge($equipoActividad);
/* The next code is this*/
$formulario = $this->createForm(new EquipoActividadType(array('idUsuario' => $user->getIdUser())), $equipoActividad);          
$formulario->handleRequest($request);

ERROR:

Entity was not found. 

Upvotes: 0

Views: 1031

Answers (1)

DonCallisto
DonCallisto

Reputation: 29942

$equipoActividad = $request->getSession()->get("equipoActividad");

then

$em->merge($equipoActividad);

All entities that will be handle by doctrine need to be managed. Session object aren't anymore. So you don't need to create a brand-new one as with merge() entity manager takes care for you to manage again that entity and from that time on, you can use it like you've fetched from db.

If you want to know more about, read http://doctrine-orm.readthedocs.org/en/latest/cookbook/entities-in-session.html


EDIT

Error here is due to your object status: in fact you didn't persisted it before session store (merge need the entity to be already persisted and flushed to db). You can either persist/flush it before storing in session or after it, when you use session retrieval facility.

BTW you can also not persist it if you don't need to :)

Upvotes: 2

Related Questions