Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 它';可以将会话中存储的实体持久保存在Symfony2+;教义2?_Php_Symfony_Orm_Doctrine Orm - Fatal编程技术网

Php 它';可以将会话中存储的实体持久保存在Symfony2+;教义2?

Php 它';可以将会话中存储的实体持久保存在Symfony2+;教义2?,php,symfony,orm,doctrine-orm,Php,Symfony,Orm,Doctrine Orm,在我的项目中,我正在处理某种“复杂”表单,其中实体在每个步骤上都被持久化,因为单个表单在每个步骤上被拆分。然后是第一步(我们称之为step1),在这一步中,我将持久化一个实体并将其存储在会话中,请参见下面的代码: $productoSolicitudEntity = new Entity\ProductoSolicitud(); $productoSolicitudForm = $this->createForm(new Form\ProductoSolicitudForm(), $pro

在我的项目中,我正在处理某种“复杂”表单,其中实体在每个步骤上都被持久化,因为单个表单在每个步骤上被拆分。然后是第一步(我们称之为step1),在这一步中,我将持久化一个实体并将其存储在会话中,请参见下面的代码:

$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\DistributidorProductOSolicitud#producto_Requestud”找到了一个新实体,该关系未配置为级联实体的持久化操作: AppBundle\Entity\ProductoSolicitud@000000000a1f3e9d00007f88c54033f8. 要解决此问题,请显式调用此未知实体上的EntityManager#persist(),或者在映射中配置cascade persist此关联 @manytone(..,cascade={“persist”})。如果无法找到导致问题的实体,请执行“AppBundle\entity\ProductoSolicitud#uu toString()”以获取线索

由于冲突实体似乎是
DistributibidorProductOSolicitud
,因此我对其进行了以下更改:

/**
 * @ORM\ManyToOne(targetEntity="\AppBundle\Entity\ProductoSolicitud", cascade={"persist"})
 * @ORM\JoinColumn(name="producto_solicitud_id", referencedColumnName="id")
 */
protected $producto_solicitud;
但是解决不了问题,有什么帮助吗?怎么了?我错过了什么?我应该在
ProductoSolicitud
实体中添加一个方法
\uuu toString()
,但这应该返回什么

这是涉及该问题的实体:

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”}
应该去哪里

我找到了一个帖子,但没用

尝试将
cascade={“persist”}
添加到
ManyToOne
的两侧(在
ProductoSolicitud
distributidorproductosolicitud
中)

如果此
manytone
是单向的,请尝试将其更改为
OneToMany
双向,并在两侧保留级联

类内产品许可证:

/**
 * @OneToMany(targetEntity="AppBundle\Entity\DistribuidorProductoSolicitud", mappedBy="producto_solicitud", cascade={"persist"})
   @var \Doctrine\Common\Collections\ArrayCollection
 **/
 private $distribuidor_producto_solicidudes;
/**
 * @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;
类内发行版或产品许可证:

/**
 * @OneToMany(targetEntity="AppBundle\Entity\DistribuidorProductoSolicitud", mappedBy="producto_solicitud", cascade={"persist"})
   @var \Doctrine\Common\Collections\ArrayCollection
 **/
 private $distribuidor_producto_solicidudes;
/**
 * @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;
尝试将
cascade={“persist”}
添加到
ManyToOne
的两侧(在
ProductoSolicitud
distributidorproductosolicitud
中)

如果此
manytone
是单向的,请尝试将其更改为
OneToMany
双向,并在两侧保留级联

类内产品许可证:

/**
 * @OneToMany(targetEntity="AppBundle\Entity\DistribuidorProductoSolicitud", mappedBy="producto_solicitud", cascade={"persist"})
   @var \Doctrine\Common\Collections\ArrayCollection
 **/
 private $distribuidor_producto_solicidudes;
/**
 * @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;
类内发行版或产品许可证:

/**
 * @OneToMany(targetEntity="AppBundle\Entity\DistribuidorProductoSolicitud", mappedBy="producto_solicitud", cascade={"persist"})
   @var \Doctrine\Common\Collections\ArrayCollection
 **/
 private $distribuidor_producto_solicidudes;
/**
 * @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;
保存(或序列化)条令实体()——因为它丢失了检测系统中可以识别的水合条令对象所需的私有属性

由于水合原则对象的那些私有属性丢失,它将这些未水合对象视为全新的(以及其他相关对象)

最好的解决方案是只在会话中存储对象标识符,然后使用
find()
helper函数检索它们

储存:

$this->get('session')->set('objectId', $object->getId());
要稍后获取,请执行以下操作:

$objectId = $this->get('session')->get('objectId');
$object = $this->getDoctrine()->getRepository('AcmeBundle:Entity')->find($objectId);
保存(或序列化)条令实体()——因为它丢失了检测系统中可以识别的水合条令对象所需的私有属性

由于水合原则对象的那些私有属性丢失,它将这些未水合对象视为全新的(以及其他相关对象)

最好的解决方案是只在会话中存储对象标识符,然后使用
find()
helper函数检索它们

储存:

$this->get('session')->set('objectId', $object->getId());
要稍后获取,请执行以下操作:

$objectId = $this->get('session')->get('objectId');
$object = $this->getDoctrine()->getRepository('AcmeBundle:Entity')->find($objectId);

好的,给我一分钟时间编辑帖子并添加相关实体,因为我迷路了,不知道应该在哪里添加
cascade={“persist”}
完成,请看一看,如果可以的话,用代码示例改进你的答案,并提前感谢Ok,请给我一分钟时间编辑帖子并添加相关实体,因为我迷路了,不知道应该在哪里添加
cascade={“persist”}
完成,请看一看,如果可以的话,用代码示例改进你的答案,并提前感谢你的意思“仅在会话中存储对象标识符,然后使用find()helper函数检索它们"? 你能写一段代码来说明你的意思吗?我不知道怎么做这是基本的东西-我已经添加了一些例子。确保替换了正确的实体名称。好的,好的,还有一个问题,在设置会话之前我是否应该删除会话?例如:
$session->remove('requestudusuarioid')$会话->设置('requestudusuarioid',$requestudusuarioentity->getId())
还是一直覆盖?@ReynierPM它的行为就像一个普通的PHP数组-如果每次都使用相同的键,它将覆盖:)而不是find你可以使用引用代理(它不执行任何db查询)。你说的“只在会话中存储对象标识符,然后用find()helper函数检索它们”是什么意思? 你能写一段代码来说明你的意思吗?我不知道怎么做这是基本的东西-我已经添加了一些例子。确保替换了正确的实体名称。好的,好的,还有一个问题,在设置会话之前我是否应该删除会话?例如:
$session->remove('requestudusuarioid')$会话->设置('requestudusuarioid',$requestudusuarioentity->getId())
还是一直覆盖?@ReynierPM它的行为就像一个普通的PHP数组-如果每次都使用相同的键,它将覆盖:)而不是find,您可以使用引用代理(它不执行任何db查询)。