我正在我的项目中处理某种"复杂"的表单,其中实体在每个步骤上都是持久的,因为各个表单都是分开的.然后我迈出了第一步(让我们称之为步骤1),我坚持一个实体并将其存储在会话中,请参阅下面的代码:
$productoSolicitudEntity = new Entity\ProductoSolicitud(); $productoSolicitudForm = $this->createForm(new Form\ProductoSolicitudForm(), $productoSolicitudEntity); $productoSolicitudForm->handleRequest($request); if ($productoSolicitudForm->isValid()) { $productoSolicitudRequest = $request->get('productoSolicitud'); try { $producto = $em->getRepository("AppBundle:Producto")->find($productoSolicitudRequest['producto']['nombre']); $productoSolicitudEntity->setProducto($producto); $condicionProducto = $em->getRepository("AppBundle:CondicionProducto")->find($productoSolicitudRequest['condicion_producto']); $productoSolicitudEntity->setCondicionProducto($condicionProducto); $finalidadProducto = $em->getRepository("AppBundle:FinalidadProducto")->find($productoSolicitudRequest['finalidad_producto']); $productoSolicitudEntity->setFinalidadProducto($finalidadProducto); $procedenciaProducto = $em->getRepository("AppBundle:ProcedenciaProducto")->find($productoSolicitudRequest['procedencia_producto']); $productoSolicitudEntity->setProcedenciaProducto($procedenciaProducto); $productoSolicitudEntity->setLote($productoSolicitudRequest['lote']); $solicitudUsuario = $em->getRepository("AppBundle:SolicitudUsuario")->find($session->get('solicitudUsuarioEntity')->getId()); $productoSolicitudEntity->setSolicitudUsuario($solicitudUsuario); $em->persist($productoSolicitudEntity); $em->flush(); $session->set('productoSolicitudEntity', $productoSolicitudEntity); $response['success'] = true; } catch (Exception $ex) { $status = 400; $response['error'] = $ex->getMessage(); } } else { $status = 400; $response['error'] = $this->get('translator')->trans('formularioNoValido'); $response['formError'] = $this->getFormErrors($productoSolicitudForm); }
然后在四个步骤(让我们称之为步骤4)我需要将该实体附加到一个新实体,因为它们是相关的,这是涉及的代码:
$productoSolicitud = $session->get('productoSolicitudEntity'); if (! $productoSolicitud) { $status = 400; $response['error'] = 'No se encontró la solicitud'; } $distribuidorEntity = new Entity\FabricanteDistribuidor(); $distribuidorForm = $this->createForm(new Form\DistribuidorForm(), $distribuidorEntity); $distribuidorForm->handleRequest($request); if ($distribuidorForm->isValid()) { $em->persist($distribuidorEntity); $em->flush(); $session->set('distribuidorEntity', $distribuidorEntity); $distribuidorProductoSolicitudEntity = new Entity\DistribuidorProductoSolicitud(); $distribuidorProductoSolicitudEntity->setProductoSolicitud($productoSolicitud); $distribuidorProductoSolicitudEntity->setFabricanteDistribuidor($distribuidorEntity); $em->persist($distribuidorProductoSolicitudEntity); $em->flush(); $session->set('distribuidorEntity', $distribuidorEntity); }
但是我收到了这个错误:
通过"AppBundle\Entity\DistribuidorProductoSolicitud#producto_solicitud"关系找到了一个新实体,该关系未配置为级联实体的持久化操作:AppBundle\Entity\ProductoSolicitud @ 000000000a1f3e9d00007f88c54033f8.要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如@ManyToOne(..,cascade = {"persist"}).如果您无法找出导致问题的实体,请执行'AppBundle\Entity\ProductoSolicitud #__ toString()'以获取线索.
由于冲突的实体似乎是在DistribuidorProductoSolicitud
那时我对它做了这样的改变:
/** * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\ProductoSolicitud", cascade={"persist"}) * @ORM\JoinColumn(name="producto_solicitud_id", referencedColumnName="id") */ protected $producto_solicitud;
但是没有解决问题,有什么帮助吗?有什么不对?我在这里缺少什么?我应该__toString()
在ProductoSolicitud
实体上添加一个方法,但这应该返回什么?
这是涉及该问题的实体:
class DistribuidorProductoSolicitud { use IdentifierAutogeneratedEntityTrait; /** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\FabricanteDistribuidor") * @ORM\JoinColumn(name="fabricante_distribuidor_id", referencedColumnName="id") */ protected $fabricante_distribuidor; /** * @ORM\ManyToOne(targetEntity="AppBundle\Entity\ProductoSolicitud", cascade={"persist"}) * @ORM\JoinColumn(name="producto_solicitud_id", referencedColumnName="id") */ protected $producto_solicitud; /** * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Pais", inversedBy="distribuidorProductoSolicitudPais", cascade={"persist"}) * @ORM\JoinTable(name="nomencladores.pais_distribuidor_producto_solicitud", schema="nomencladores", * joinColumns={@ORM\JoinColumn(name="distribuidor_producto_solicitud_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="pais_id", referencedColumnName="id")} * ) */ protected $paisesDistribuidorProductoSolicitudPais; } class ProductoSolicitud { use IdentifierAutogeneratedEntityTrait; /** * @var \Producto * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Producto") * @ORM\JoinColumn(name="producto_id", referencedColumnName="id") */ protected $producto; /** * @var \SolicitudUsuario * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\SolicitudUsuario", cascade={"persist"}) * @ORM\JoinColumn(name="solicitud_usuario_id", referencedColumnName="id") */ protected $solicitud_usuario; /** * @var \CondicionProducto * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\CondicionProducto") * @ORM\JoinColumn(name="condicion_producto_id", referencedColumnName="id") */ protected $condicion_producto; /** * @var \FinalidadProducto * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\FinalidadProducto") * @ORM\JoinColumn(name="finalidad_producto_id", referencedColumnName="id") */ protected $finalidad_producto; /** * @ORM\Column(name="lote", type="integer", nullable=false) */ protected $lote; /** * @var \ProcedenciaProducto * * @ORM\ManyToOne(targetEntity="AppBundle\Entity\ProcedenciaProducto") * @ORM\JoinColumn(name="procedencia_producto_id", referencedColumnName="id") */ protected $procedencia_producto; }
cascade={"persist"}
应该去哪里修理它?
我找到了这篇文章,但没有用.
将一个Doctrine实体保存(或序列化)到会话是有问题的(这里是关于此问题的相关SO问题/答案) - 因为它丢失了检测可在系统中识别的水合Doctrine对象所需的私有属性.
由于缺少水合Doctrine对象的私有属性,它会将这些未水合的对象视为全新的(以及其他相关对象).
您最好的解决方案是仅将对象标识符存储在会话中,然后使用find()
辅助函数检索它们.
储藏:
$this->get('session')->set('objectId', $object->getId());
要稍后获取:
$objectId = $this->get('session')->get('objectId'); $object = $this->getDoctrine()->getRepository('AcmeBundle:Entity')->find($objectId);