我正在我的项目中处理某种“复杂”的表单,其中实体在每个步骤上都是持久的,因为各个表单都是分开的。然后我迈出了第一步(让我们称之为步骤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 \实体\ ProductoSolicitud @ 000000000a1f3e9d00007f88c54033f8。要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如 @ManyToOne(..,级联= { “持续”})。如果您无法找出导致问题的实体,请执行'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"}
应该去哪里修复它?
我发现了this帖子,但没有用。
答案 0 :(得分:7)
保存(或序列化)一个Doctrine实体to the session is problematic(here's a relevant SO question/answer on the matter) - 因为它丢失了检测系统中可识别的水合Doctrine对象所需的私有属性。
由于缺少水合Doctrine对象的私有属性,它会将这些未水合的对象视为全新的(以及其他相关对象。)
您最好的解决方案是仅将对象标识符存储在会话中,稍后使用find()
辅助函数检索它们。
存储:
$this->get('session')->set('objectId', $object->getId());
稍后提取:
$objectId = $this->get('session')->get('objectId');
$object = $this->getDoctrine()->getRepository('AcmeBundle:Entity')->find($objectId);
答案 1 :(得分:1)
尝试将cascade={"persist"}
添加到ManyToOne
的两侧(ProductoSolicitud
和DistribuidorProductoSolicitud
)。
如果此ManyToOne
是单向的,请尝试将其更改为OneToMany
双向,并且两端都保持级联。
课程ProductoSolicitud:
/**
* @OneToMany(targetEntity="AppBundle\Entity\DistribuidorProductoSolicitud", mappedBy="producto_solicitud", cascade={"persist"})
@var \Doctrine\Common\Collections\ArrayCollection
**/
private $distribuidor_producto_solicidudes;
在DistribuidorProductoSolicidud类中:
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\ProductoSolicitud", inversedBy="distribuidor_producto_solicidudes", cascade={"persist"})
* @ORM\JoinColumn(name="producto_solicitud_id", referencedColumnName="id")
@var \AppBundle\Entity\ProductoSolicidud
*/
protected $producto_solicitud;